https://www.myziyuan.com/

- 1264737478
- /////////////////////////////////////////////////下面是客户端代码注意服务器ip地址你自己定哈,我这里利用本机回环地址// client.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<Winsock2.h>#include<stdio.h>#include "string.h"#pragma comment(lib,"WSOCK32.lib") //必须的#define PORT 5000#define BUFFER 5000WSADATAwsaData;SOCKETclient;intport=PORT;//从服务器接收的数据长度intiLen;//接受数据的缓冲charbuf[BUFFER];//服务器端地址struct sockaddr_inserv;DWORD WINAPI RecvThread(LPVOID lpParam){//从服务器接收数据while(1){iLen=recv(client,buf,sizeof(buf),0);if(iLen==0)return 0;else if(iLen==SOCKET_ERROR){printf("recv()failed:%d\n",WSAGetLastError());return 0;}else{printf("Server send :%s\n",buf);///////////////////////////////int num=0;int sum=0;int i;for(i=0;i<=strlen(buf);i++){if(buf[i]<='9'&&buf[i]>='0'){num=num*10+buf[i]-'0';continue;}sum+=num;num=0;}printf("The Sum is: %d .....Now Send To Server....\n",sum);sprintf(buf,"%d\nInput Data:",sum);int iSend=send(client,buf,sizeof(buf),0);//发送信息if(iSend==SOCKET_ERROR){printf("send()failed:%d\n",WSAGetLastError());break;}else{printf("Send Ok\n");}////////////////////////////////}}return 0;}void main(int argc,char *argv[]){//判断输入的参数是否正确/*if(argc<2)//注释掉了输入参数问题{//提书输入服务器IP地址printf("Input the server IP address:\n");return ;}*///接受数据缓冲区初始化memset(buf,0,sizeof(buf));if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");return;}//需要连接的服务器地址信息serv.sin_family=AF_INET;//需要连接的服务器地址信息serv.sin_port=htons(port);//将命令行的IP地址转化为二进制表示的网络字节顺序IP地址serv.sin_addr.s_addr=inet_addr("127.0.0.1");//建立客户端流套接字client=socket(AF_INET,SOCK_STREAM,0);if(client==INVALID_SOCKET){printf("socket()failed:%d\n",WSAGetLastError());return;}//请求与服务器建立TCP连接if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET){printf("connet()failed:%d\n",WSAGetLastError());return;}else{HANDLE hThread;hThread=CreateThread(NULL,NULL,RecvThread,0,0,0); //创建接受信息线程printf("Wait Server Send Data...\n"); while(1){///////////////////////send datagets(buf);int iSend=send(client,buf,sizeof(buf),0);//发送信息if(iSend==SOCKET_ERROR){printf("send()failed:%d\n",WSAGetLastError());break;}//////////////}}closesocket(client);WSACleanup();printf("press any key to continue"); //加了这两句,不让程序退出}//////////////////下面是服务端// sever.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<Winsock2.h>#include<stdio.h>#include<stdlib.h>#include "string.h"#define PORT 5000#define BUFFER 1024#pragma comment(lib,"WSOCK32.lib") //必须的intport=PORT;WSADATAwsaData;SOCKETsListen,sAccept;//客户地址长度intiLen;//发送数据长度intiSend;//需要发送的信息charbuf[BUFFER];//服务器、客户的地址struct sockaddr_in serv,cliet;DWORD WINAPI RecvThread(LPVOID lpParam){//static int i=0;//printf("%d",i++);while(1){//从服务器接收数据iLen=recv(sAccept,buf,sizeof(buf),0);if(iLen==0)return 0;else if(iLen==SOCKET_ERROR){printf("recv()failed:%d\n",WSAGetLastError());return 0;}else{//printf("Client Send The Sum Back is:");printf("%s",buf);}}return 0;}int main(int argc, char* argv[]){if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf("Winsock load failed\n");//return;}//创建套接字sListen=socket(AF_INET,SOCK_STREAM,0);if(sListen==INVALID_SOCKET){printf("socket failed:%d\n",WSAGetLastError());return;}//建立服务器地址serv.sin_family=AF_INET;//把一个双字节主机字节顺序的数据转换为网络字节顺序serv.sin_port=htons(port);//把四字节主机字节顺序转换为网络字节顺序,INADDR_ANY为系统指定的IP地址serv.sin_addr.s_addr=htonl(INADDR_ANY);if(bind(sListen,(LPSOCKADDR)&serv,sizeof(serv))==SOCKET_ERROR){printf("bind()failed:%d\n",WSAGetLastError());return;}//进入监听状态if(listen(sListen,5)==SOCKET_ERROR){printf("listen()failed:%d\n",WSAGetLastError());return;}//初始化客户地址长度iLen=sizeof(cliet);//进入循环,等待客户连接请求sAccept=accept(sListen,(struct sockaddr*)&cliet,&iLen);HANDLE hThread;hThread=CreateThread(NULL,NULL,RecvThread,0,0,0);printf("InPut Data:");while(1){if(sAccept==INVALID_SOCKET){printf("accept()failed:%d\n",WSAGetLastError());break;}//printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(cliet.sin_addr),ntohs(cliet.sin_port));gets(buf);//给连接的客户发送信息iSend=send(sAccept,buf,sizeof(buf),0);if(iSend==SOCKET_ERROR){printf("send()failed:%d\n",WSAGetLastError());break;}printf("Client Send The Sum Back is:");}closesocket(sAccept);closesocket(sListen);WSACleanup();}
- 2021-02-22 02:20:01
- 1264737478
- 在《TCP/IP详解 卷2:实现》中你可以找到更深层次的代码。讲的是Berkeley的联网程序哈,其中有讲socket的,不过和windows的socket有不一样哈
- 2021-02-11 19:32:52
- 十里八乡
- Linux中C语言的一个函数的源代码:socket 编程中的 recv() 函数。,1、recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态。2、recv函数只是在用户空间定义的。内核空间有与之对应的函数,也就是说,执行recv函数就会调用到内核中与它对应的函数,实际起作用的就是内核里的这个函数。至于内核里调用的是那个函数,内核里的调用关系复杂的很,除非对内核非常了解的,才会找到到底是怎么调用的,他也是只是找到怎么调用的。
- 2021-02-11 19:32:52