TCP-socket(2)

来源:互联网 发布:ubuntu安装mac os 编辑:程序博客网 时间:2024/06/01 19:36

Server.cpp

// server.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Winsock2.h>#pragma comment(lib,"ws2_32.lib")int main(int argc, char* argv[]){//加载winsock库WSADATA wsaData;WORD sockVersion = MAKEWORD(2,2);if(WSAStartup(sockVersion,&wsaData)!=0)   return 0;//创建套接字SOCKET sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);                //创建socketif(sServer==INVALID_SOCKET){   printf("socket error\n");   return 0;}//socket中装入地址信息sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(1129);sin.sin_addr.S_un.S_addr = INADDR_ANY;//bind套接字if(bind(sServer,(LPSOCKADDR)&sin,sizeof(sin)) == SOCKET_ERROR)           //绑定bind{   printf("bind error!\n");   return 0;}//listen模式if(listen(sServer,5) == SOCKET_ERROR)                                    //监听listen{   printf("listen error!\n");   closesocket(sServer);   return 0;}//循环接受连接请求sockaddr_in remoteAddr;SOCKET sClient;int nAddrLen=sizeof(SOCKADDR_IN);char revData[255];int flag = 1;char data[12]={'1','2','3','4','5','6','7','8','9','a','b','c'}; //待发送数据int tmp = 0;while(1){tmp = 0;//等待客户请求的到来   sClient = accept (sServer,(SOCKADDR*)&remoteAddr,&nAddrLen);          //接受accept(阻塞) 等待请求      if(sClient==INVALID_SOCKET)   {printf("accept error\n");continue;   }   printf("接受来自%s的连接.\n",inet_ntoa(remoteAddr.sin_addr));   //发送数据    while(flag){   char SendData[4];   int i,ch;   for( i = 0; i<=2; i++)   {SendData[i] = data[i+tmp];   }if(tmp == 12){   break;}   tmp = tmp + 3;   SendData[i] = '\0';   //SendData[i+1] = '\0';       send(sClient,SendData,4,0);   printf("数据:%s\n",SendData);}/*   while(true)   {int ret = recv(sClient,revData,255,0);if(ret==0||(ret==SOCKET_ERROR&&WSAGetLastError()==WSAECONNRESET)){ printf("%s关闭连接\n",inet_ntoa(remoteAddr.sin_addr)); closesocket(sClient); break;}else{ revData[ret]='\0'; printf("%s",revData);}   }   *///关闭套接字(链接)closesocket(sClient);}//关闭套接字closesocket(sServer);WSACleanup();return 0;}

Client.cpp

// client.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Winsock2.h>#pragma comment(lib,"ws2_32.lib")#include <stdio.h>#define PORT 1129#define ADDRESS "127.0.0.1"int main(int argc, char* argv[]){//加载winsock库WSADATA wsaData;WORD sockVersion = MAKEWORD(2,2);if(WSAStartup(sockVersion,&wsaData)!=0)   return 0;//创建套接字SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);                    //创建socketif(sClient==INVALID_SOCKET){   printf("socket error\n");   return 0;}//socket中装入远程地址信息SOCKADDR_IN remote;remote.sin_family = AF_INET;remote.sin_port = htons(1129);remote.sin_addr.S_un.S_addr = inet_addr(ADDRESS);if(connect(sClient,(SOCKADDR *)&remote,sizeof(SOCKADDR))==SOCKET_ERROR)      //连接connet{   printf("connect error\n");   closesocket(sClient);   return 0;}int index =0;//接收数据(分段接收数据)while(true){char revData[4];recv(sClient,revData,4,0);                                            //接收recvrevData[3]='\0';printf("%s\n",revData);index = index +1;if(index == 4)break;}/*while(true){   char SendData[255];   int i,ch;   for( i = 0; (i < 254) && ((ch = getchar()) != EOF) && (ch!='\n'); i++)   SendData[i] = (char)ch;   SendData[i] = '\n';   SendData[i+1] = '\0';       send(sClient,SendData,i+2,0);   printf("数据:%s\n",SendData);}*///关闭套接字closesocket(sClient);WSACleanup();return 0;}

利用socket进行数据分段发送,运行结果:

第一次请求:

服务器


客户端



第二次请求:



0 0