求一个带注释的最简单的sock聊天代码 服务端和客户端能互相聊天就行。只要求在winmain()下的。MFC不要。简单入门即可。带注释书上的例子也可以,给我一个吧。谢谢了。想了解下winmain()函数下cock是怎么初始化,怎么用的…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://hcmfys.javaeye.com/blog/617224这个应该可以帮到你,我当初也是看着这份代码学习的。 1.void main() 2.{ 3. WORD wVersionRequested; 4. WSADATA wsaData; 5. int err; 6. 7. wVersionRequested = MAKEWORD( 1, 1 ); //使用socket1.1版本8. 9. err = WSAStartup( wVersionRequested, &wsaData ); //初始化socket通信环境10. if ( err != 0 ) { 11. return; 12. } 13. 14. 15. if ( LOBYTE( wsaData.wVersion ) != 1 || 16. HIBYTE( wsaData.wVersion ) != 1 ) { 17. WSACleanup( ); //清理18. return; 19. } 20. SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //使用TCP/IP协议和流式传输生成一个socket21. 22. SOCKADDR_IN addrSrv; //为服务器端socket绑定地址23. addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //0,0,0,0 监听本电脑上的所有IP地址,如果有多网卡,则同时监听多网卡24. addrSrv.sin_family=AF_INET; //地址族25. addrSrv.sin_port=htons(6000); //6000端口26. 27. bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定28. 29. listen(sockSrv,5); //是sockSrv保持监听状态,同时最多允许5个客户端连接30. 31. SOCKADDR_IN addrClient; 32. int len=sizeof(SOCKADDR); 33. 34. while(1) 35. { 36. SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //接受客户端连接(使用同步模型,在没有客户端连接的情况下,阻塞本线程)37. char sendBuf[100]; 38. sprintf(sendBuf,"Welcome %s to http://www.sunxin.org", 39. inet_ntoa(addrClient.sin_addr)); //addrClient.sin_addr指明了客户端的IP40. send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送信息给客户端41. char recvBuf[100]; 42. recv(sockConn,recvBuf,100,0); //接受客户端回应43. printf("%s\n",recvBuf); 44. closesocket(sockConn); //关闭socket45. } WSACleanUp();//清理46.} 服务端注释 4.void main() 5.{ 6. WORD wVersionRequested; 7. WSADATA wsaData; 8. int err; 9. 10. wVersionRequested = MAKEWORD( 1, 1 ); //socket1.1版本11. 12. err = WSAStartup( wVersionRequested, &wsaData ); //初始化socket环境13. if ( err != 0 ) { 14. return; 15. } 16. 17. 18. if ( LOBYTE( wsaData.wVersion ) != 1 || 19. HIBYTE( wsaData.wVersion ) != 1 ) { 20. WSACleanup( ); 21. return; 22. } 23. SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //生成实例24. 25. SOCKADDR_IN addrSrv; //需要连接的服务端地址26. addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //ip地址27. addrSrv.sin_family=AF_INET; //地址族28. addrSrv.sin_port=htons(6000); //端口29. connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //连接30. 31. char recvBuf[100]; 32. recv(sockClient,recvBuf,100,0); //接受服务端数据(同步模型下,造成线程阻塞)33. printf("%s\n",recvBuf); 34. send(sockClient,"This is lisi",strlen("This is lisi")+1,0); 35. 36. closesocket(sockClient); //关闭socket37. WSACleanup(); //清理环境38.} main我也会写,就是不知道winmain里面该怎么写?应该在哪里创建套接字?哪里侦听? 孙鑫 那个MFC书 你download个,有你想要的。 winmain和main一样写就可以了,只是入口函数不同名字而已. 如果客户端是MFC的windows程序的话,你可以吧socket的生成代码写在Oninit函数内部。然后发送之类的动作写在回车键的监听或者写一个发送按钮,写在发送按钮的click事件底下。至于接收,如果你没想做多线程或者异步通讯的话,那就只能写一个接收按钮了,在接收按钮的click事件中接收(最好你能确定按下按钮的时候,另一端已经把数据发过来了,不然界面就卡死了)。 至于服务器端的话,就写一个控制台程序吧,简单点。如果你想把服务器端也做界面的话,做完客户端你就能想到怎么写了,不是塞在Oninit事件下面,就写个按钮吧。 你不要MFC的光用SDK写恐怕会比较麻烦干嘛不用MFC直接用对话框弄不就好了 建议看孙鑫C++视频有关网络编程的那一讲,很详细.sunxin.org socket的WSAStartup初始化问题 如何保存修改软件的内存数据 在循环体执行的同时是否能捕获键盘响应? ocx调试问题 如何创建文件夹? 如何让程序只运行一个实例, MediaPlayer连续播放多个文件的问题??? 在文档类中的函数可以实现在视窗中画图吗??急 请教:如何屏蔽掉 树控件 的双击展开!!谢谢 AFX_MSG_MAP 网络方向的问题! xml格式文件,可以直接发送吗?
1.void main()
2.{
3. WORD wVersionRequested;
4. WSADATA wsaData;
5. int err;
6.
7. wVersionRequested = MAKEWORD( 1, 1 ); //使用socket1.1版本
8.
9. err = WSAStartup( wVersionRequested, &wsaData ); //初始化socket通信环境
10. if ( err != 0 ) {
11. return;
12. }
13.
14.
15. if ( LOBYTE( wsaData.wVersion ) != 1 ||
16. HIBYTE( wsaData.wVersion ) != 1 ) {
17. WSACleanup( ); //清理
18. return;
19. }
20. SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //使用TCP/IP协议和流式传输生成一个socket
21.
22. SOCKADDR_IN addrSrv; //为服务器端socket绑定地址
23. addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //0,0,0,0 监听本电脑上的所有IP地址,如果有多网卡,则同时监听多网卡
24. addrSrv.sin_family=AF_INET; //地址族
25. addrSrv.sin_port=htons(6000); //6000端口
26.
27. bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定
28.
29. listen(sockSrv,5); //是sockSrv保持监听状态,同时最多允许5个客户端连接
30.
31. SOCKADDR_IN addrClient;
32. int len=sizeof(SOCKADDR);
33.
34. while(1)
35. {
36. SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //接受客户端连接(使用同步模型,在没有客户端连接的情况下,阻塞本线程)
37. char sendBuf[100];
38. sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
39. inet_ntoa(addrClient.sin_addr)); //addrClient.sin_addr指明了客户端的IP
40. send(sockConn,sendBuf,strlen(sendBuf)+1,0); //发送信息给客户端
41. char recvBuf[100];
42. recv(sockConn,recvBuf,100,0); //接受客户端回应
43. printf("%s\n",recvBuf);
44. closesocket(sockConn); //关闭socket
45. }
WSACleanUp();//清理
46.} 服务端注释
5.{
6. WORD wVersionRequested;
7. WSADATA wsaData;
8. int err;
9.
10. wVersionRequested = MAKEWORD( 1, 1 ); //socket1.1版本
11.
12. err = WSAStartup( wVersionRequested, &wsaData ); //初始化socket环境
13. if ( err != 0 ) {
14. return;
15. }
16.
17.
18. if ( LOBYTE( wsaData.wVersion ) != 1 ||
19. HIBYTE( wsaData.wVersion ) != 1 ) {
20. WSACleanup( );
21. return;
22. }
23. SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //生成实例
24.
25. SOCKADDR_IN addrSrv; //需要连接的服务端地址
26. addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); //ip地址
27. addrSrv.sin_family=AF_INET; //地址族
28. addrSrv.sin_port=htons(6000); //端口
29. connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //连接
30.
31. char recvBuf[100];
32. recv(sockClient,recvBuf,100,0); //接受服务端数据(同步模型下,造成线程阻塞)
33. printf("%s\n",recvBuf);
34. send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
35.
36. closesocket(sockClient); //关闭socket
37. WSACleanup(); //清理环境
38.}
至于服务器端的话,就写一个控制台程序吧,简单点。如果你想把服务器端也做界面的话,做完客户端你就能想到怎么写了,不是塞在Oninit事件下面,就写个按钮吧。
干嘛不用MFC
直接用对话框弄不就好了
sunxin.org