绑定套接字 //绑定套接字 sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); service.sin_port = htons(27015); bind(SocketSvr,(SOCKADDR*)&service,sizeof(service)); //调用listen来监听客户端发来的消息 //下面的是引用与MSDN上面的文档说明 //To accept connections, a socket is first created with the socket function and bound to a local address with the bind function, //a backlog for incoming connections is specified with listen, //and then the connections are accepted with the accept function. //Sockets that are connection oriented, those of type SOCK_STREAM for example, //are used with listen. The socket s is put into passive mode where incoming connection requests are acknowledged and queued pending acceptance by the process. //下面是我的翻译 //为了接收消息,开始应该用一个socket创建一个套接字对象,然后利用bind函数把本地地址和创建 //的socket对象帮定到一起 //blaklog表示同时允许的监听最大的数,然后用accept函数去接受消息队列中的消息 //面向连接的socket,以SOCK_STREAM类型为例,应该使用listen方法 //当外来连接请求被进程确认并置于末端队列中时sockets进入被动模式 第四步:监听,接受和处理套接字 当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。
int PASCAL FAR listen( SOCKET s, int backlog ); 参 数: s:需要建立监听的Socket; backlog:最大连接个数;
服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。 代码于下 listen(SocketSvr,5); //accept函数的使用 sockaddr_in client; int ClientLen=sizeof(sockaddr_in); while(1) { //accept函数调用成功后将返回一个soket对象,所以在使用accept的时候要建立一个socket对象 //如果建立失败参考MSDN SOCKET Receive; Receive=accept(SocketSvr,(SOCKADDR*)&client,&ClientLen); //建立一个内存缓冲区来存放接收到的字符串 char buffer[50]; //格式化该内存区 sprintf(buffer,"%s:欢迎来到深蓝空间",inet_ntoa(client.sin_addr)); //调用send发送消息 send(Receive,buffer,sizeof(buffer)+1,0); //调用recv接收消息 char recvBuffer[100]; recv(Receive,recvBuffer,100,0); printf("%s",recvBuffer); closesocket(Receive); } 下面就完整的服务器端代码 #include <Winsock2.h> #include <stdio.h> int main() { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return 0; } if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return 0; } SOCKET SocketSvr; SocketSvr=socket(AF_INET,SOCK_STREAM,0); sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); service.sin_port = htons(27015); bind(SocketSvr,(SOCKADDR*)&service,sizeof(service)); listen(SocketSvr,5); sockaddr_in client; int ClientLen=sizeof(sockaddr_in); while(1) { SOCKET Receive; Receive=accept(SocketSvr,(SOCKADDR*)&client,&ClientLen); char buffer[50]; sprintf(buffer,"%s:欢迎来到深蓝空间",inet_ntoa(client.sin_addr)); send(Receive,buffer,sizeof(buffer)+1,0); char recvBuffer[100]; recv(Receive,recvBuffer,100,0); printf("%s",recvBuffer); closesocket(Receive); } return 0; } 终于搞完了晚上把客户端搞定 看MSDN看得我累死 还有一点就在连接的时候别忘记了包含Ws2_32.lib.头文件
晚上把客户端搞定 看MSDN看得我累死 还有一点就在连接的时候别忘记了包含Ws2_32.lib.头文件

|