【发布时间】:2013-12-11 03:34:18
【问题描述】:
我正在尝试编写一个客户端程序和一个服务器程序,其中当客户端连接到服务器时,服务器将一个随机字符串从文件发送回它。这是我到目前为止所拥有的(从省略的文件中读取):
server.c
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <signal.h>
int listfd;
int connfd;
int main(int argc, char *argv[]){
/*
* Create Sockets
*/
listfd = socket(AF_UNIX, SOCK_STREAM, 0);
if(listfd == -1)
exit(-1);
struct sockaddr saddr = {AF_UNIX, "server"};
socklen_t saddrlen = sizeof(struct sockaddr) + 6;
bind(listfd, &saddr, saddrlen);
listen(listfd, 10);
fflush(stdout);
printf("Running...\n");
/*
* Listen for connections
* and send random phrase on accept
*/
while(1){
connfd = accept(listfd, NULL, NULL);
int r = rand() % num_of_lines; //Pick random phrase/hint pair
write(connfd, phrases[r], strlen(phrases[r]));
close(connfd);
sleep(1);
}
exit(0);
}
client.c
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ioctl.h>
int main(int argc, char *argv[])
{
int sock;
int conn;
struct sockaddr saddr = {AF_UNIX, "server"};
socklen_t saddrlen = sizeof(struct sockaddr) + 6;
sock = socket(AF_UNIX, SOCK_STREAM, 0);
conn = connect(sock, &saddr, saddrlen);
char BUFF[1024];
read(sock, BUFF, 1024);
printf("%s", BUFF);
return 0;
}
当我尝试在客户端打印时出现问题。我运行服务器,但是当我运行客户端时,它只打印垃圾字符,我不完全确定是什么原因造成的。
任何帮助将不胜感激,谢谢!
编辑:
我发现了我的问题。因为服务器套接字绑定到“服务器”,这也是可执行文件的名称,这引起了很多问题。
重命名 sockaddr.sa_data 字段解决了我的问题。
【问题讨论】:
-
至少...在接收数据前初始化BUFF。
-
尝试发送非常大的响应(>64 字节),看看会发生什么。
-
仔细阅读 read()/write() 的手册页并了解至少对于套接字,这两个函数不一定接收/发送尽可能多的字节,但很少。因此,循环计算此类调用直到所有数据都已接收/发送是一个好主意,而不是说必不可少。
-
@alk - 你从你的“standardTCPcockups.txt”文件中复制/粘贴? :)
-
@MartinJames:在创建了几个基本相同的 cmets 之后,它收敛到了当前版本,即上面的那个。