socket 套接字的使用

socket 服务器端和客户端通信,面向TCP的

服务器端步骤:

1、创建用于监听的套接字(socket)

2、将套接字绑定到本地地址和端口上(bind)

3、将套接字设为监听模式(listen)

4、等待客户请求(accept),此处要不断的调用accept

5、通信(send/receive),完成后返回4

6、关闭套接字(closesocket)

 

客户端步骤:

1、创建套接字

2、向服务器发送连接请求(connect)

3、通信(send/recv)

4、关闭套接字

 

程序代码:

服务器端:

#include <WinSock2.h>

#include <stdio.h>

#pragma comment(lib,"Ws2_32.lib.")



void main()

{



	/* 加载套接字库 */

	WORD wVersionRequested;

	// 所使用套接字的版本号

	WSADATA wsaData;

	// 存储套接字版本的有关信息

	int err;



	wVersionRequested = MAKEWORD(1,1);

	// 请求版本号,高位和低位字节均为1



	err = WSAStartup(wVersionRequested,&wsaData);

	// 加载套接字

	if(err != 0)

	{

		return;

	}



	if (LOBYTE(wsaData.wVersion)!=1 ||

		HIBYTE(wsaData.wVersion)!=1)

	{

		WSACleanup();

		//如果高位或低位字节不为1终止对套接字的使用

		return;

	}



	/* 创建用于监听的套接字 */

	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);

	// 创建套接字,流式套接字,第三个参数设为0则自动选择合适的协议



	/* 绑定套接字 */

	SOCKADDR_IN addrSrv;

	// 服务器地址信息,使用SOCKADDR_IN 代替SOCKETADD, 结构体的大小相等,可强制转换

	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

	addrSrv.sin_family=AF_INET;

	addrSrv.sin_port=htons(600);

	// 使用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 www.cnblogs.com/xiao-cheng",

			inet_ntoa(addrClient.sin_addr));

		send(sockConn,sendBuf,strlen(sendBuf)+1,0);

		// 发送数据,多加一个长度是字符串结束符

		char recvBuf[100];

		recv(sockConn,recvBuf,100,0);

		// 接收数据

		printf("%s\n",recvBuf);

		closesocket(sockConn);

	}

}
客户端:
#include <WinSock2.h>

#include <stdio.h>

#pragma comment(lib,"Ws2_32.lib.")



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(600);



	connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

	// 向服务器发送连接请求



	char recvBuf[100];

	recv(sockClient,recvBuf,100,0);

	printf("%s\n",recvBuf);



	send(sockClient,"Request",strlen("Request")+1,0);



	closesocket(sockClient);

	WSACleanup();

}

你可能感兴趣的:(socket)