套接字编程了解下就可以了!使用的时候拷贝下来使用!还有这个是在我本机测试是!在两台电脑测试的话改IP地址就好了!服务器端代码
- #include <Winsock2.h>//套接字需要的头文件
- #include <stdio.h>
- #pragma comment(lib,"ws2_32.lib") //添加预处理文件#pragmacomment(lib,"ws2_32.lib")
- void main()
- {
- //WSAStartup函数 用处加载套接字winsokeDLL,套接字版本.失败返回0
- WORD wVersionRequested;//定义一个WORD类型变量.
- WSADATA wsaData;//定义一个指向wsa(data->数据)的一个指针
- int err;
- wVersionRequested=MAKEWORD(1,1);//设定一个版本号!
- err=WSAStartup(wVersionRequested,&wsaData);//wVersionRequested版本号,&wsData winsocket的实现细节
- if(err!=0)//失败
- {
- return;//返回
- }
- if( LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//判断请求的版本号是不是1.1
- {
- WSACleanup(); //不是1.1版本终止winsokeDLL
- return;//返回
- }
- SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//第一个参数地址族基于ip/TCP,1.1版本的套接字一般固定写为AF_INET!第二的参数是流式套接字,0指地址家族默认协议!填零帮你自动选择
- SOCKADDR_IN addSrv;//定义一个地址结构体变量
- addSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY,这样会对所有有效IP都适用//htonl->u_long类型的主机字节序到IP/TCP网络字节序.
- addSrv.sin_family=AF_INET;//固定一般就赋值为AF_INET
- addSrv.sin_port=htons(6000);//端口号
- /*绑定*/bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//第一个参数需要绑定的套接字,第二个参数套接字地址(套接字地址 为接收成功后返回客户端的网络地址
- /*监听*/listen(sockSrv,5);//最多连接等待数为5.
- SOCKADDR_IN addrClient;//用来记录客户端端口ip地址等信息的地址结构.(这个注释是我自己理解的,不过好多教程都不是这么讲的)
- int len=sizeof(SOCKADDR);//计算地址结构的长度
- while(1)
- {
- /*等待*/SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//第一个原套接字,接收客户端信息,第三个参数包含地址结构的长度。//返回新的套接字
- printf("N关闭程序\n");
- char a[10];
- scanf("%s",&a);
- if (strcmp(a,"N") == 0)
- {
- break;
- }
- char sendbuf[100];
- char recvbuf[100];
- int b=1;
- while(1)
- {
- if(b==1)
- {
- sprintf(sendbuf,"客户端IP:%s",inet_ntoa(addrClient.sin_addr));
- send(sockConn,sendbuf,strlen(sendbuf)+1,0);
- }
- b++;
- printf("等待客户端应答...\n");
- recv(sockConn,recvbuf,100,0);//参数1当前的套接字,参数2字符缓冲区,参数3长度,参数4,一般为0.
- printf("%s\n",recvbuf);
- if(b==2)
- {
- printf("N退出聊天循环...\n");
- }
- scanf("%s",&sendbuf);
- if (strcmp(sendbuf,"N") == 0)
- {
- break;
- }
- send(sockConn,sendbuf,strlen(sendbuf)+1,0);//当前连接套接字,发送字符缓冲区,长度,一般为0;
- }
- closesocket(sockConn);//关闭套接字
- WSACleanup();//关闭sock动态连接库
- }
- }
复制代码
客户端代码:
- #include<windows.h>
- #include<stdio.h>
- #include<Winsock.h>
- #pragma comment(lib,"ws2_32.lib")
- void main()
- {
- //WORD wVersionRequested;//定义一个WORD类型变量.
- WSADATA wsaData;//定义一个指向wsa(data->数据)的一个指针
- int err;
- // wVersionRequested=MAKEWORD(1,1);//设定一个版本号!
- err=WSAStartup(MAKEWORD(1,1),&wsaData);//wVersionRequested版本号,&wsData winsocket的实现细节
- if(err!=0)//失败
- {
- return;//返回
- }
- if( LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//判断请求的版本号是不是1.1
- {
- WSACleanup(); //不是1.1版本终止winsokeDLL
- return;//返回
- }
- SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);//第一个参数地址族基于ip/TCP,1.1版本的套接字一般固定写为AF_INET!第二的参数是流式套接字,0指地址家族默认协议!填零帮你自动选择
- SOCKADDR_IN addSrv;//定义一个地址结构体变量
- addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//INADDR_ANY,这样会对所有有效IP都适用//htonl->u_long类型的主机字节序到IP/TCP网络字节序.
- addSrv.sin_family=AF_INET;//固定一般就赋值为AF_INET.基于IP/TCP协议
- addSrv.sin_port=htons(6000);//设置端口号6000。将一个无符号短整型的主机数值转换为网络字节顺序
- connect(sockClient,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));//参数1,要进行连接的套接字,参数2,地址结构体里面有客户端的端口需要连接的服务器IP地址等信息(本人是这样理解的),参数3地址结构体大小
- char sendbuf[100];
- char recvbuf[100];
- while(1)
- {
- printf("等待服务器端应答.........\n");
- recv(sockClient,recvbuf,100,0);
- printf("%s\n",recvbuf);
- recvbuf[100]=0;
- sendbuf[100]=0;
- scanf("%s",&sendbuf);
- send(sockClient,sendbuf,strlen(sendbuf)+1,0);//发送
- //第一个参数是当前套接字,第二个参数是字符缓冲区,第三个参数是计算长度,第4个参数是0一般都是怎么写。
- }
- closesocket(sockClient);//关闭套接字
- WSACleanup();//关闭sock动态连接库
- }
复制代码
|