C中的简单TCP客户端服务模型:客户端未接收

C中的简单TCP客户端服务模型:客户端未接收,c,tcp,client,recv,C,Tcp,Client,Recv,我正在用c语言制作一个简单的TCP客户机服务器,我试图从客户机向服务器发送消息,但我遇到了一些问题。 服务器确实发送消息(整数值>0),但客户端无法接收消息(整数值>0) 代码如下: 客户 #包括 #包括 #包括 #包括 #包括 int main() { int s_id; char*msg=“你好”; 服务地址中的结构sockaddr\u; s_id=套接字(AF_INET,SOCK_STREAM,0); serv_addr.sin_family=AF_INET; serv_addr.sin_

我正在用c语言制作一个简单的TCP客户机服务器,我试图从客户机向服务器发送消息,但我遇到了一些问题。 服务器确实发送消息(整数值>0),但客户端无法接收消息(整数值>0) 代码如下: 客户

#包括
#包括
#包括
#包括
#包括
int main()
{
int s_id;
char*msg=“你好”;
服务地址中的结构sockaddr\u;
s_id=套接字(AF_INET,SOCK_STREAM,0);
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(1156);
serv_addr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
连接(s_id,(struct sockaddr*)和serv_addr,sizeof(struct sockaddr));
int r=recv(s_id,(char*)msg,9,0);
printf(“%d\n”,r);
printf(“%s\n”,msg);
返回0;
}
服务器:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int main()
{
       int s_id;
       char *msg = "connected";
       struct sockaddr_in my_addr, remote_addr;
       s_id = socket (PF_INET,SOCK_STREAM,0);
       my_addr.sin_family = AF_INET;
       my_addr.sin_port = htons(1156);
       my_addr.sin_addr.s_addr  = inet_addr("127.0.0.1");

       bind(s_id,(struct sockaddr *) &my_addr, sizeof(struct sockaddr));
       listen (s_id,5);
       int size = sizeof (struct sockaddr_in);
       int new_sd = accept (s_id, (struct sockaddr *) &remote_addr, &size);
       int s= send(new_sd, (void *)msg, 9, 0);
       printf("%d \n", s );
       return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
int s_id;
char*msg=“已连接”;
我的地址、远程地址中的结构sockaddr\u;
s_id=套接字(PF_INET,SOCK_STREAM,0);
我的地址sin家庭=AFINET;
my_addr.sin_port=htons(1156);
my_addr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
绑定(s_id,(struct sockaddr*)和my_addr,sizeof(struct sockaddr));
听(s_id,5);
int size=sizeof(结构sockaddr_in);
int new_sd=accept(s_id,(struct sockaddr*)和remote_addr,&size);
int s=发送(新的(无效*)消息,9,0);
printf(“%d\n”,s);
返回0;
}
我得到的输出(首先启动服务器,然后启动客户机)是 服务器端:9 客户端:-1 你好

我正在使用Ubuntu11.04和gcc编译器

我希望外面有人能帮忙。 多谢各位


Umar

在执行任何操作后,都不会检查错误。所有等。在出现故障时返回
-1
,然后您可以使用函数打印错误描述。每个系统调用手册页面都列出了可能的错误

编辑0:
真正的问题可能是Brian指出的——您正试图将数据接收到客户端的只读内存中。它是否因segfault而死亡?

在发生任何故障后,您都不会检查错误。所有等。在出现故障时返回
-1
,然后您可以使用函数打印错误描述。每个系统调用手册页面都列出了可能的错误

char *msg = "hello";
编辑0: 真正的问题可能是Brian指出的——您正试图将数据接收到客户端的只读内存中。它是因为一个错误而死的吗

char *msg = "hello";
这是一个字符串文本。这是一个常数,你不能改变它

int r = recv (s_id, (char *) msg, 9, 0);
你正试着给它写信

将您的声明更改为:

char msg[20];
memset(msg, 0, sizeof(msg));
如果进行了更改,代码将按预期工作

在C语言中,您必须分配和管理缓冲区—没有免费的午餐:)

还要注意来自的另一个答案-您确实应该检查所有系统调用的返回代码

这是一个字符串文本。这是一个常数,你不能改变它

int r = recv (s_id, (char *) msg, 9, 0);
你正试着给它写信

将您的声明更改为:

char msg[20];
memset(msg, 0, sizeof(msg));
如果进行了更改,代码将按预期工作

在C语言中,您必须分配和管理缓冲区—没有免费的午餐:)


还要注意来自的另一个答案-您确实应该检查所有系统调用的返回代码

recv
是永久阻塞还是返回?如果是后者,请检查错误号,方法是执行以下操作:
If(int r=recv(s_id,(char*)msg,9,0)<0){perror(“recv”);}
如果可能,请在编写新网络代码时使用getaddrinfo。recv是永久阻塞还是返回?如果是后者,请检查errno,方法是执行
If(int r=recv(s_id,(char*)msg,9,0)<0){perror(“recv”);}
如果可能,请在编写新网络代码时使用getaddrinfo这会给我一个分段错误。之后,我还将其初始化为“hello”。这确实消除了分段错误,但我无法接收消息……但现在我可以感谢@Brian Roachbefore,我刚刚执行了一个简单的声明,即,
char*msg这会给我一个分段错误。之后,我还将其初始化为“hello”。这确实消除了分段错误,但我无法收到消息……但现在我可以感谢@Brian Roach