Socket编程时recv函数错误:Transport endpoint is not connected的解决

今天在做socket网络通信实验时,server端执行到recv函数处报错:Transport endpoint is not connected。

以下是server和client的源码:

server.c

 1 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 #include <sys/socket.h>
 4 #include <string.h>
 5 #include <unistd.h>
 6 #include <stdlib.h>
 7 #define SERVER_PORT 5000
 8
 9
10 int main(){
11     /*地址初始化*/
12     struct sockaddr_in serveraddr;
13     struct sockaddr_in clientaddr;
14      memset(&serveraddr,0,sizeof(serveraddr));
15      serveraddr.sin_family = AF_INET;
16      serveraddr.sin_addr.s_addr = INADDR_ANY;
17      serveraddr.sin_port = htons(SERVER_PORT);
18     bzero(&(serveraddr.sin_zero),8);
19     //1.create sock
20     int sock,conn,sbind,lis;
21     char buf[32];
22     sock = socket(AF_INET,SOCK_STREAM,0);
23     if(sock ==-1){perror("sock error");exit(1);}
24     //2.bind
25     sbind = bind(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
26      if(sock ==-1){perror("bind error");exit(1);}
27     //3.listen
28     lis = listen(sock, 2);
29     if(lis ==-1){perror("listen error");exit(1);}
30     //4.accept
31     int acc,snd,rec;
32     int len = sizeof(struct sockaddr_in);
33     while(1){
34         acc = accept(sock,(struct sockaddr*)&clientaddr, (socklen_t*)&len);
35         if(acc == -1){
36             perror("accept error!");continue;
37         }
38         if((rec=recv(sock,buf,1024,0))==-1){perror("server connect failed!");exit(1);}//错误的地方
39         buf[rec]=‘\0‘;
40         if(strcmp(buf,"liu")==0){
41             snd =  send(acc, "Hello,You are connected\n", 24, 0);
42         }
43     }
44
45     close(sock);
46     return 0;
47 }

client.c

#include <stdio.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define SERVER_PORT 5000

int main(){
	/*地址初始化*/
	struct sockaddr_in serveraddr;
	 memset(&serveraddr,0,sizeof(serveraddr));
	 serveraddr.sin_family = AF_INET;
	 serveraddr.sin_addr.s_addr = INADDR_ANY;
	 serveraddr.sin_port = htons(SERVER_PORT);
	bzero(&(serveraddr.sin_zero),8);
	//1.create sock
	int sock,conn;
	char buf[32];
	sock = socket(AF_INET,SOCK_STREAM,0);
	conn =  connect(sock,  (struct sockaddr*)&serveraddr, sizeof(serveraddr));
	if(conn ==-1){perror("connect error");exit(1);}
	int snd;
	snd =  send(sock, "liu", 4, 0);
	if(snd ==-1){perror("send error");exit(1);}
	int rec;
	if((rec=recv(sock,buf,1024,0))==-1){perror("client connect failed!");exit(1);}
	buf[rec]= ‘\0‘;
	printf("received:%s",buf);
	close(sock);
	return 0;
}

  错误出在recv这个函数。

首先我们来看看accept函数:int accept(int sockfd, void *addr, int *addrlen);

它的返回值是一个客户端的套接字描述符,所以recv和send函数的第一个参数应该填写accept返回的套接字描述符。

所以将server.c中的

 if((rec=recv(sock,buf,1024,0))==-1){perror("server connect failed!");exit(1);}改为:
 if((rec=recv(acc,buf,1024,0))==-1){perror("server connect failed!");exit(1);}即可
				
时间: 2024-08-10 17:56:27

Socket编程时recv函数错误:Transport endpoint is not connected的解决的相关文章

【爬坑】Python 3.6 在 Socket 编程时出现类型错误 TypeError: a bytes-like object is required, not &#39;str&#39;

1. 问题描述 Python 3.6 在 Socket 编程时出现错误如下 Traceback (most recent call last): File "F:/share/IdeaProjects/test/mypython/test/test10_tcpclient.py", line 17, in <module> sock.send(str) TypeError: a bytes-like object is required, not 'str' Process

socket编程中recv与send函数

recv函数会将套接字缓冲区中的内容读出,但不清空,与read函数的区别在此.此函数有一个flag标志位,设为MSG_PEEK. send函数会将缓冲区中的内容写入到套接字,也不清空,与write函数的区别在此. 用这两个函数可以先接收或发送缓冲区中的内容,然后再用readn(此时缓冲区中的内容依然存在)与write函数去继续判断换行符/n,对缓冲区内容实现换行输出. echocli.c #include <unistd.h> #include <sys/types.h> #inc

linux Socket send与recv函数详解

转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags); 3 ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags)

Linux socket 编程中 write 函数使用的注意事项

很多人都以为使用write和使用send发送数据是一样的,确实都可以发送数据,但是有一点需要注意: write 函数不能保证发送的数据一次都能发送完 ,可能只发送了一部分(当内核发送缓冲区满的时候),这点就破坏了数据发送的"原子性",这个原子操作只的是单个包发送的过程中不会被其他发送操作影响.如果中间被打断,那么在同一个 socket 上的其他线程的发送操作就有可能在你间断后,进入发送,导致最后的包混乱.所以最好还是使用 send 来发送. 但也不是说 send 不会被打断,当发送的过

编程时遇到的错误和问题

Spring控制器(Controller)中要用MultipartFile接受网页表格提交的文件时,应当现在spring配置文件中添加对MultipartFile的配置: <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncodin

c++中Socket编程(入门)

在学习Socket编程时,在其他地方看到了不错Socket入门文档,通俗易懂: 介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等等- 好在我已经将这些事完成了,我将和所有人共享我的知识了.如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了. 读者对象 这个文档是一个指南,而不是参考书.如果你刚开始 socket 编程并想找一本入门书,那么你

linux下socket编程-进程间通信

一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM).流式是一种面向连接针对于面向连接的TCP服务应用:数据报式Socket是一种无连接针对无连接的UDP服务应用.sock通信的基本过程如下: 二.Socket建立 程序可以调用Socket函数建立socket,该函数返回一个类似

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

网络编程学习笔记:linux下的socket编程

socket是进程通信的一种方式,通过调用一些API可以实现进程间通信,建立连接以及收发信息的过程如下图所示: 这些函数的用法如下: 1.int socket(int protocolFamily, int type, int protocol); 返回描述符sockfd l  protocolFamily:协议族,AF_INET(IPV4).AF_INET6(IPV6).AF_LOCAL(或称AF_UNIX,unix域socket).AF_ROUTE等.协议族决定了socket的地址类型,在通