【发布时间】:2014-01-27 00:42:09
【问题描述】:
我是 C 网络的新手,我一直在尝试让服务器从客户端检索消息,但是写入消息仍然失败。当我做这个时,我基本上试图修改一个从服务器接收消息以发送它的程序。这是服务器代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORTNUM 1887
int server() {
char msg[101];
struct sockaddr_in dest;
struct sockaddr_in serv;
int mysocket;
socklen_t socksize = sizeof(struct sockaddr_in);
memset(&serv, 0, sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
serv.sin_port = htons(PORTNUM);
mysocket = socket(AF_INET, SOCK_STREAM, 0);
bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr));
listen(mysocket, 2);
int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
int len;
while (consocket) {
printf("Incoming connection from %s - recieving welcome\n", inet_ntoa(dest.sin_addr));
len = recv(mysocket, msg, 100, 0);
msg[len] = '\0';
if (len > 0) printf("%s %d\n", msg, len);
consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
}
close(consocket);
close(mysocket);
return EXIT_SUCCESS;
}
int main() {
return server();
}
这是客户端。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define MAXREC 100
#define PORTNUM 1887
int getMessage() {
char buffer[] = "Hello Fish!\n";
int len, mysocket;
struct sockaddr_in dest;
mysocket = socket(AF_INET, SOCK_STREAM, 0);
memset(&dest, 0, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
dest.sin_port = htons(PORTNUM);
connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr));
printf("%s\n", buffer);
write(mysocket,"45", strlen("45"));
close(mysocket);
return EXIT_SUCCESS;
}
int main() {
return getMessage();
}
最初我尝试发送缓冲区消息,然后我转而尝试使用常量来查看是否有帮助。
【问题讨论】:
-
请注意,标准 C 不了解网络。您可能在 Linux 或其他一些符合 Posix 的系统上。因此,请相应地标记您的问题。
-
为什么你只在一条消息后循环调用
accept?一个给定的 TCP 连接通常用于多个消息.... -
Deos 的“真实”代码也完全忽略了测试各种系统调用是否失败?
-
另外,请仔细阅读
read()/recv()/write()/send()的手册页,并了解至少对于套接字,这些功能不一定是读/接收/写/发送尽可能多的字节,但很少。因此,循环计算此类调用,直到所有数据或终止符已被接收/发送是一个好主意,而不是说必不可少的必要性。 -
@BasileStarynkevitch 这不应该是一个完成的应用程序,我只是想弄清楚它是如何工作的,所以这个简单的程序只是发送一条消息
标签: c linux networking