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

使用TCP+winsock写的一个简单服务器程序(转)

2012-01-12 17:25 357 查看
本代码用VS2008编写:

[cpp:firstline[1]]
view plaincopyprint?

//先打开服务器端,服务器在执行完recv()后堵塞,等待接收数据...
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32.LIB")
void main()
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
char RecviverBuf[1024];
int BufLength = 1024;
int Port = 8060;
int Ret;
//初始化Winsock版本2.2
if((Ret =WSAStartup(MAKEWORD(2,2),&wsaData)) != 0)
{
printf("ERROR:WSAStartup failed with %d/n",Ret);
return;
}
//创建一个新的套接字来监听客户机链接
if(INVALID_SOCKET == (ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)))
{
printf("ERROR:SOCKET failed with %d/n",WSAGetLastError());
WSACleanup();
return;
}
//建立一个SOCKADDR_IN结构,这个结构告知bind我们想得到的8060端口监听所有接口上的连接
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//使用bind将这个地址信息和套接字关联起来
if(SOCKET_ERROR == bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)))
{
printf("ERROR:bind failed with %d/n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}

//监听客户机连接。这里使用5个backlog,许多应用程序一般都使用这个数量
if(SOCKET_ERROR == listen(ListeningSocket,5))
{
printf("ERROR:listen failed with %d/n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
//连接到达时,接受一个新的连接
int ClientAddrLen = sizeof(ClientAddr);
if(INVALID_SOCKET == (NewConnection = accept(ListeningSocket,(SOCKADDR *)&ClientAddr,&ClientAddrLen)))
{
printf("ERROR:accept failed with %d/n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
printf("accept succeed!/n");
//接受数据
//注意recv()/send()和recvfrom()/sendto()的区别:使用recv()/send()需要先建立连接,而recvfrom()/sendto()不需要先建立连接...
if(SOCKET_ERROR == recv(NewConnection,RecviverBuf,BufLength,0))
{
printf("ERROR:recv failed with %d/n",WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
printf("recv succeed!/n");
//显示接收到的数据
for(int id=0; id<5 ;++id)
printf("%c",RecviverBuf[id]);
//完成接受新连接后,应该用closesocket API关闭这些套接字
closesocket(NewConnection);
closesocket(ListeningSocket);
//应用程序完成对连接的处理后,调用WSACleanup
WSACleanup();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: