您的位置:首页 > 理论基础 > 计算机网络

基于TCP的Socket网络编程,有图有代码

2012-06-20 18:25 381 查看
1.新建一个工作区 Tcp

在工作区中添加两个工程 TcpSrv(服务端)和TcpClient (客户端)



2.在工程TcpSrv添加TcpSrv.cpp文件

代码如下:

#include <WINSOCK2.H>
#include <stdio.h>

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0 )
	{
		return;
	}

	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) !=1 )
	{
		WSACleanup();
		return;
	}
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //htonl() 将主机的无符号长整形数转换成网络字节顺序
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000); //htons() 将主机的无符号短整形数转换成网络字节顺序

	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  //将套接字绑定到一个已知的地址上

	listen(sockSrv,5);

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	while (1)
	{
		SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		char sendBuf[100];
		sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",     //sprintf 把格式化的数据写入某个字符串中
			inet_ntoa(addrClient.sin_addr));          //inet_ntoa将一个IP转换成一个互联网标准点分格式的字符串
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);
		printf("%s\n",recvBuf);
		closesocket(sockConn);
	}

}




编译时会报错,添加链接库文件 ws2_32.lib



3.在工程TcpClient中添加 TcpClient.cpp 文件

代码如下

#include <WINSOCK2.H>
#include <stdio.h>

void main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1,1);

	err = WSAStartup(wVersionRequested,&wsaData);
	if (err != 0)
	{
		return;
	}

	if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE(wsaData.wVersion) != 1 )
	{
		WSACleanup();
		return;
	}
	SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);

	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  //连接 建立socket连线

	char recvBuf[100];
	recv(sockClient, recvBuf , 100 , 0 );
	printf("%s\n",recvBuf);
	send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);

	closesocket(sockClient);  //关闭套接字
	WSACleanup();  //中止Winsock 2 DLL (Ws2_32.dll) 的使用
}


同样添加库文件ws2_32.lib 记得前面有个空格











4.先运行服务端程序后运行客户端程序会看到效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: