tcp的socket编程(tcp socket)

      最后更新:2023-03-22 22:40:40 手机定位技术交流文章

      采用tcp协议,使用socket编程,编写程序完成客户端发送消息给服务端,服务端接到消息后,再发

      服务端代码: /*server.c*/#include #include #include #include #include #include #include #include #define PORT4321#define BUFFER_SIZE 1024#define MAX_QUE_CONN_NM 5int main(){struct sockaddr_in server_sockaddr, client_sockaddr;int sin_size, recvbytes;int sockfd, client_fd;char buf[BUFFER_SIZE];/*建立socket连接*/if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1){perror("socket");exit(1);}printf("Socket id = %dn",sockfd);/*设置sockaddr_in 结构体中相关参数*/server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_port = htons(PORT);server_sockaddr.sin_addr.s_addr = INADDR_ANY;bzero(&(server_sockaddr.sin_zero), 8);int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));/*绑定函数bind*/if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1){perror("bind");exit(1);}printf("Bind success!n");/*调用listen函数*/if (listen(sockfd, MAX_QUE_CONN_NM) == -1){perror("listen");exit(1);}printf("Listening....n");/*调用accept函数,等待客户端的连接*/if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1){perror("accept");exit(1);}/*调用recv函数接收客户端的请求*/memset(buf , 0, sizeof(buf));if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1){perror("recv");exit(1);}printf("Received a message: %sn", buf);if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1){perror("send");exit(1);}close(sockfd);exit(0);}客户端:/*client.c*/#include #include #include #include #include #include #include #include #include #define PORT4321#define BUFFER_SIZE 1024int main(int argc, char *argv[]){int sockfd, sendbytes;char buf[BUFFER_SIZE];struct hostent *host;struct sockaddr_in serv_addr;if(argc < 3){fprintf(stderr,"USAGE: ./client Hostname(or ip address) Textn");exit(1);}/*地址解析函数*/if ((host = gethostbyname(argv[1])) == NULL){perror("gethostbyname");exit(1);}memset(buf, 0, sizeof(buf));sprintf(buf, "%s", argv[2]);/*创建socket*/if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){perror("socket");exit(1);}/*设置sockaddr_in 结构体中相关参数*/serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);serv_addr.sin_addr = *((struct in_addr *)host->h_addr);bzero(&(serv_addr.sin_zero), 8);/*调用connect函数主动发起对服务器端的连接*/if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1){perror("connect");exit(1);}/*发送消息给服务器端*/if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1){perror("send");exit(1);}if ((recvbytes = recv(sockfd, buf, BUFFER_SIZE, 0)) == -1){perror("recv");exit(1);}close(sockfd);exit(0); }
      采用tcp协议,使用socket编程,编写程序完成客户端发送消息给服务端,服务端接到消息后,再发

      用c语言写个 socket tcp 的

      #include #include #include #pragma comment(lib,"ws2_32.lib")typedef struct{SOCKET accpt;int lock;}Arg;void *transfer(void *arg){Arg * info = (Arg *)arg;SOCKET clientSock;char recvbuf[102];char sendBuf[] = "10";int ret;memcpy(&clientSock,(void*)&info->accpt,sizeof(clientSock));info->lock =1;while (TRUE){ret = send(clientSock,sendBuf,2,0);if (ret == -1){break;}ret = recv(clientSock,recvbuf,102,0);printf("%sn",recvbuf);}return (void *)0;}void* timer(void *arg){time_t last = time(NULL);time_t now;int i = 20;while(i--){now= time(NULL);if(now - last == 1){printf("1s past!n");last = now;}Sleep(500);}printf("timer exit.n");return (void *)0;}int main(void) {WSADATA wsaData;SOCKET ListenSocket;SOCKADDR_IN service,client;int len = sizeof(client);Arg argument;pthread_t tid;char sendBuf[] = "ID=2;WHAT=host";int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);if (iResult != NO_ERROR) {printf("Error at WSAStartup()n");return 1;}ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (ListenSocket == INVALID_SOCKET) {printf("Error at socket(): %ldn", WSAGetLastError());WSACleanup();return 1;}service.sin_family = AF_INET;service.sin_addr.s_addr = inet_addr("127.0.0.1");service.sin_port = htons(27115);if (bind( ListenSocket,(SOCKADDR*) &service,sizeof(service)) == SOCKET_ERROR) {printf("bind() failed.n");closesocket(ListenSocket);WSACleanup();return 1;}if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {printf("Error listening on socket.n");closesocket(ListenSocket);WSACleanup();return 1;}argument.lock = 1;printf("Waiting for client to connect...n");pthread_create(&tid,NULL,timer,NULL);while(TRUE){argument.accpt = accept( ListenSocket, (SOCKADDR*)&client, &len );if (argument.accpt == INVALID_SOCKET) {printf("accept failed: %dn", WSAGetLastError());closesocket(ListenSocket);WSACleanup();return 1;} else {printf("accept%s:%dn",inet_ntoa(client.sin_addr),client.sin_port);while (!argument.lock);argument.lock = 0;//sendto(argument.accpt,sendBuf,sizeof(sendBuf),0,(SOCKADDR*)&client,len);pthread_create(&tid,NULL,transfer,&argument);//send(AcceptSocket,sendBuf,sizeof(sendBuf),0);}}// No longer need server socketclosesocket(ListenSocket);WSACleanup();return 0;}发送数据格式按需求。可以发送字符串,也可以发送结构体。如果发送结构体的话,要注意序列化和反序列化。程序例子是服务器对每个客户端的connect动作起一个线程去交互。还有一个线程是定时器。
      用c语言写个 socket tcp 的

      基于TCP面向连接的socket编程。运行出错,一直出现 “烫”字。用的vs2010

      char RecvBuf[100]; recv(SocketClient,RecvBuf,100,0);//接收服务器数据printf("%sn",RecvBuf);也许没有接收到数据,所以在printf()输出时输出了没有初始化的字串。你可以试一下:char RecvBuf[100]={""};recv(SocketClient,RecvBuf,100,0);//接收服务器数据 printf("%sn",RecvBuf);
      char RecvBuf[100]; recv(ScoketConn,RecvBuf,100,0);//step5 接收数据printf("%sn",RecvBuf);问题出在这里,字符串的显示,字符串末尾必须以‘'结束,否则显示会出错。这样试试:char RecvBuf[101];recv(ScoketConn,RecvBuf,100,0);//step5 接收数据RecvBuf[100] = ''; printf("%sn",RecvBuf);
      recv(ScoketConn,RecvBuf,100,0);//step5 接收数据 两种修改办法:1,memset(buff,0,sizeof(buff)); 将buff全部置为0 2,int n = recv(...); buff[n] = '';
      你用的是两台电脑么,如果是,请更换客户端IP地址为服务器端IP!
      数组接收的时候,后面是空的,等于说数组要接受十个,你只收到九个,就会有烫。
      基于TCP面向连接的socket编程。运行出错,一直出现 “烫”字。用的vs2010

      Python 之 Socket编程(TCP/UDP)

      socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。有效的端口号: 0~ 65535但是小于1024的端口号基本上都预留给了操作系统POSIX兼容系统(如Linux、Mac OS X等),在/etc/services文件中找到这些预留端口与的列表面向连接的通信提供序列化、可靠的和不重复的数据交付,而没有记录边界。意味着每条消息都可以拆分多个片段,并且每个消息片段都能到达目的地,然后将它们按顺序组合在一起,最后将完整的信息传递给等待的应用程序。实现方式(TCP):传输控制协议(TCP), 创建TCP必须使用SOCK_STREAM作为套接字类型因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的IP,所以整个系统通常结合这两种协议(TCP/IP)来进行网络间数据通信。数据报类型的套接字, 即在通信开始之前并不需要建议连接,当然也无法保证它的顺序性、可靠性或重复性实现方式(UDP)用户数据包协议(UDP), 创建UDP必须使用SOCK_DGRAM (datagram)作为套接字类型它也使用因特网来寻找网络中主机,所以是UDP和IP的组合名字UDP/IP注意点:1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。TCP的优点:可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。TCP的缺点:慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。什么时候应该使用TCP :当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输.UDP的优点:快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……UDP的缺点:不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。什么时候应该使用UDP:当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……
      Python 之 Socket编程(TCP/UDP)

      简述基于TCP和UDP的Socket编程的异同

      Socket有两种主要的操作方式:面向连接的和无连接的。无连接的操作使用UDP数据报协议,这个操作不需要连接一个目的的socket,它只是简单地投出数据报,快速高效,但缺少数据安全性。面向连接的操作使用TCP协议,一个这个模式的socket必须在发送数据之前与目的地的socket取得一个连接,一旦连接建立了,socket就可以使用一个流接口:打开-读-写-关闭,所有的发送的信息都会在另一端以同样的顺序被接收,面向连接的操作比无连接的操作效率要低,但数据的安全性更高。基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采用的数据报套接字(SOCK_DGRAM). 流式套接字的设计是针对面向连接的网络应用,在数据传输之前需要预先建立连接,在数据传输过程中需要维持连接,在数据传输结束后需要释放连接。由于采用校验和、确认与超时等差错控制手段,因此流式套接字可以保证数据传输的正确性。 数据报套接字(SOCK_DGRAM)提供无连接的、不可靠的数据传输服务,实际上它是基于TCP/IP协议族中的UDP协议实现的。数据报套接字提供无序、有差错与有重复的数据流服务。数据报套接字的设计是针对无连接的网络应用,在数据传输之前不需要预先建立连接。由于只采用很有限的差错控制手段,因此数据报套接字无法保证数据传输的正确性。
      tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。
      tcp是面向连接的,网络上的任意计算机,都要连接到服务器才能和其他的计算机交互。 udp是面向无连接的,不需要服务器也可以交互,只要知道对方的ip和监听端口就行。。 TCP是一种很保险的链接,需要三次握手,所以数据的发送不会丢失,能根据网络的拥塞自动调整发送的时延,,,而UDP是一种不保险的链接,数据发出去后不管对面会不会收到,多用于语音视频通话中。
      实现方法 以及API 不同。运用的地方不同。当然主要取决去二者的各自特点。1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作;(3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高;(4)UDP段结构比TCP的段结构简单,因此网络开销也小。 具体二种协议没有好坏,只有适合,有时候二者结合,比如QQ就是两种协议都有,比如组播通信的时候只能用udp
      简述基于TCP和UDP的Socket编程的异同

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/59463.html

          热门文章

          文章分类