Network Programming for Microsoft Windows 2nd
winsock 从linux sock 发展过来, 目前是2.2 版本, windows 网络编程通常需要包含winsock2.h , 链接ws2_32.lib.
如下一个简单服务器代码
#include <winsock2.h>
#include <stdio.h>
#pragma comment (lib, "ws2_32.lib")
#define PORT 80
#define ADDR "127.0.0.1"
int main (int argc, char *argv[])
{
WSADATA wsock ;
SOCKET listensocket , newconnection;
SOCKADDR_IN serveraddr , cliaddr;
int cliaddrlen =sizeof( cliaddr);
int nret =0;
char buf [100];
printf("init winsock.............................\n" );
if(WSAStartup (MAKEWORD(2,2), & wsock) != 0)
{
printf("wsastart up failed\n" );
exit(0);
}
printf("create socket...........................\n");
listensocket= socket(AF_INET ,SOCK_STREAM, IPPROTO_TCP);
if(listensocket ==INVALID_SOCKET)
{
printf("create socket failed\n" );
WSACleanup();
return 0;
}
printf("create sock success\n" );
serveraddr.sin_family =AF_INET;
serveraddr.sin_port =htons( PORT);
serveraddr.sin_addr .s_addr= INADDR_ANY;
if(bind (listensocket, ( SOCKADDR*)&serveraddr , sizeof(serveraddr ))==SOCKET_ERROR)
{
printf("bind failed\n" );
closesocket(listensocket );
WSACleanup();
return 0;
}
if(listen (listensocket, 5)== SOCKET_ERROR)
{
printf("LISTEN failed\n" );
closesocket(listensocket );
WSACleanup();
return 0;
}
printf("PLEASE WAIT\n" );
newconnection=accept (listensocket,( SOCKADDR*)&cliaddr , &cliaddrlen);
if(newconnection ==INVALID_SOCKET)
{
printf("connet failed\n" );
closesocket(listensocket );
WSACleanup();
return 0;
}
printf("accept a connect\n" );
closesocket(listensocket );
memset(buf , 0, sizeof( buf));
while(1)
{
nret = recv (newconnection, buf, sizeof (buf), 0);
if(nret ==SOCKET_ERROR)
{
printf("recv failed\n" );
closesocket(newconnection );
WSACleanup();
return 0;
}
printf("%s\n" , buf);
if(strncmp (buf, "exit", strlen ("exit"))==0)
{
break;
}
}
closesocket(newconnection );
WSACleanup();
return 0;
return 0;
}