浏览 16915 次
锁定老帖子 主题:socket编程
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-26
1、Socket服务器端:
Socket服务器端流程如下:加载套接字->创建监听的套接字->绑定套接字->监听套接字->处理客户端相关请求。 下面是孙鑫VC详解里面的服务器端的例子: #include <Winsock2.h> #include <stdio.h> 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 sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //绑定套接字 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //将套接字设置为监听模式,准备接受用户请求 listen(sockSrv,5); SOCKADDR_IN addrClient; int len=sizeof(SOCKADDR); printf("%s\n","welcome,the serve is started..."); while (1) { //等待用户请求到来 SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[100]; sprintf(sendBuf,"welcome %s to http://unblue2008.iteye.com",inet_ntoa(addrClient.sin_addr)); //发送数据 send(sockConn,sendBuf,100,0); char revBuf[100]; //接收数据 recv(sockConn,revBuf,100,0); //打印接受数据 printf("%s\n",revBuf); //关闭套接字 closesocket(sockConn); } } 注意:需要包含头文件<Winsock2.h>,并且在工程设置的link里面加上ws32_2.dll 如果在VC中还有一个简单的加载套接字的方法: if (!AfxSocketInit()) { AfxMessageBox("套接字加载失败!"); return false; } 这个不需要包含上面注里面的头文件和ws2_32.lib库就可以实现加载套接字。 2、Socket客户端: Socket客户端同样需要先加载套接字,然后创建套接字,不过之后不用绑定和监听了,而是直接连接服务器,发送相关请求。 同样贴出孙鑫VC详解里面的客户端的例子:(不是我偷懒,是人家实在写的太好,无法超越 ) #include <Winsock2.h> #include <stdio.h> 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");//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //向服务器发送请求 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //接受数据 char recBuf[100]; recv(sockClient,recBuf,100,0); printf("%s\n",recBuf); //发送数据 send(sockClient,"this is 扈修非",strlen("this is 扈修非")+1,0); //关闭套接字 closesocket(sockClient); WSACleanup(); } 需要加载的头文件和库同上 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-26
socket通讯,MFC封装并不是很好,但是楼主还是写的很好,,如果有可能的话,建议看看ACE最网络通讯这块封装的非常好!
|
|
返回顶楼 | |
发表时间:2009-10-13
ICE是比socket更高一层的玩意了。
拿 ace tao跟它比差不多。 |
|
返回顶楼 | |
发表时间:2009-10-13
半支烟021 写道 socket通讯,MFC封装并不是很好,但是楼主还是写的很好,,如果有可能的话,建议看看ACE最网络通讯这块封装的非常好!
初学者别看ACE,多了解些,WINSOCK,lib net。熟悉使用select、poll、epoll模式,熟悉内存管理,多线程编程等! 然后再看ACE等网络库,学其架构。 |
|
返回顶楼 | |
发表时间:2009-12-31
boost的asio还是不错的。
|
|
返回顶楼 | |