使用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();
}
[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();
}
相关文章推荐
- 使用TCP+winsock写的一个简单服务器程序
- 使用TCP+winsock写的一个简单客户端程序(转)
- 使用TCP+winsock写的一个简单客户端程序
- 使用winsock+UDP写的一个简单发送端程序(转)
- 使用winsock+UDP写的一个简单接收端程序(转)
- 使用winsock+UDP写的一个简单接收端程序
- 使用winsock+UDP写的一个简单发送端程序
- 使用Go开发一个简单的服务器程序
- C++ 使用模版范式写一个单例模式的类--简单实现单例模式
- 一个使用超简单C++封装的网络库(包含服务器端和客户端,跨平台,比较适用于移动终端)
- php使用face++实现一个简单的人脸识别系统
- 使用go语言的list实现一个简单的LRU缓存
- 浅谈Python使用Bottle来提供一个简单的web服务
- (14)树莓派B+使用L298N驱动控制四驱车并实现一个简单的web控制端
- 使用azkaban 建立一个简单的任务调度系统
- [ActionScript 3] 分享一个超强大的starling粒子编辑器和简单的使用教程
- (译)如何使用GameCenter制作一个简单的多人游戏教程:第二部分
- 一个使用Ruby on Rails开发LBS网站的简单实例
- 使用react-native做一个简单的应用-06商品界面的实现
- 如何使用纯win32函数和C语言实现一个简单的文本编辑器