- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个客户端程序和一个服务器程序,其中当客户端连接到服务器时,服务器将文件中的随机字符串发回给它。这是我到目前为止所拥有的(从省略的文件中读取):
#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);
}
#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;
}
当我尝试在客户端中打印时出现了问题。我运行服务器,但当我运行客户端时,它只打印乱码,我不完全确定是什么原因造成的。
非常感谢任何帮助,谢谢!
我想出了我的问题。因为服务器套接字绑定(bind)到“服务器”,这也是可执行文件的名称,这导致了很多问题。
重命名 sockaddr.sa_data 字段解决了我的问题。
最佳答案
你有很多问题。这是错误的:
struct sockaddr saddr = {AF_UNIX, "server"};
socklen_t saddrlen = sizeof(struct sockaddr) + 6;
你告诉内核“这是一个代表套接字地址的字节包。它是 sizeof(struct sockaddr) + 6
字节长”,但你只是传入了 sizeof (struct sockaddr)
字节。结果:内核越界读取您的地址,最好的情况是导致系统调用失败并返回 EFAULT
,最坏的情况是导致内核读取垃圾数据。
设置 AF_UNIX
套接字地址的正确方法是使用用于 AF_UNIX
套接字的套接字地址类型,即 struct sockaddr_un
(参见 unix(7)
):
struct sockaddr_un saddr = {AF_UNIX, "/socket/path"};
bind(listfd, (struct sockaddr *)&saddr, sizeof(saddr));
同样,调用 connect(2)
的客户端代码也应该以相同的方式设置地址。
接下来,您需要检查错误。此处几乎所有系统调用都可能失败,因此您需要在每次调用后检查失败并适当处理(通常关闭套接字和/或终止进程并显示适当的错误消息)。
正如您所提到的,您还需要为套接字选择一个合适的路径名。命名的 AF_UNIX
套接字存在于文件系统中,因此不能与任何其他文件共享相同的名称,包括您的服务器和客户端程序。
您对 read(2)
的调用需要使用返回值来确定读取的字节数。它不会以空值终止其输出——如果它读取 4 个字节,那 4 个字节将在您的缓冲区中,之后的所有其他内容都将不确定。由于 printf
期望其输入以空值终止,因此您需要自己显式地以空值终止,或者传入长度,例如:
int n = read(sock, BUFF, sizeof(BUFF));
if (n < 0) { /* Handle error */ }
printf("%.*s", n, BUFF);
关于客户端/服务器套接字通信 (AF_UNIX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20510016/
我正在尝试编写一个客户端程序和一个服务器程序,其中当客户端连接到服务器时,服务器将文件中的随机字符串发回给它。这是我到目前为止所拥有的(从省略的文件中读取): 服务器.c #include #inc
我正在通过 unix 本地套接字(AF_UNIX 地址系列,即 而不是 UDP )使用数据报实现一个简单的服务。服务器绑定(bind)到一个公共(public)地址,它接收请求就好了。不幸的是,在回复
我在 AF_UNIX 套接字通信方面遇到了一些问题,因为在写入数据缓冲区后,似乎仍然有一些挂起的字节需要读取,但我不知道它们来自哪里。 我正在用 C 编写一个多线程服务器程序,通过 AF_UNIX 套
Server Side: void getMessage(int aSock){ int n=0; char recvline[1025];
嗨,我正在尝试制作一个简单的程序,它可以 fork ,然后应该像客户端/服务器一样运行。这是我的代码: int main (){ int sfd,fdc; struct sockaddr_un sa;
我想知道:当使用套接字 (AF_UNIX) 在 C 中编程时,在向套接字发送或从套接字接收时是否有任何限制(以字节为单位)? 最佳答案 您可以使用 setsockopt 为每个单独的套接字连接更改读写
所以,我正在尝试编写一些 JNA 代码来使用 Unix 套接字,并且我正在尝试为套接字引用 AF_UNIX。我查看了一些 gcc 包含的文件,但找不到任何东西。 最佳答案 它可能与平台有关,这就是为什
这个问题在这里已经有了答案: Are parallel calls to send/recv on the same socket valid? (3 个答案) 关闭 6 年前。 环顾四周,但找不到
我看到一对 AF_UNIX 套接字由调用创建的一些奇怪的事情,例如: socketpair(AF_UNIX, SOCK_STREAM, 0, sfd); 其中 sfd 是文件描述符的 int[2]
When using socket in the UNIX domain, it is advisable to use path name for the directory directory m
我第一次开始研究 Python 中的 socket 库,我意识到有一个常量叫做 AF_UNIX与 AF_INET 相同,但速度更快,仅与同一台机器建立连接并使用系统文件而不是互联网连接 但我不明白的是
事实 在 POSIX 文档中,我看不到任何阻止将 SO_REUSEADDR 套接字选项与 AF_UNIX 一起用于 UNIX 域套接字的情况。 但是,如果套接字节点已经存在,它总是会在绑定(bind)
我想实现 python official documentation on socket module 中的示例使用 AF_UNIX 套接字代替 AF_INET。现在服务器代码是这样的: import
我正在为大学做一个项目。需要编写一个套接字的代码,一个服务器和一个客户端通过这个套接字进行通话。消息是这样的: typedef struct { /** message type */ c
有一个应用程序在 FreeBSD 10.1 版本 操作系统上运行,我需要弄清楚如何找到它已创建和正在使用的套接字。我知道我正在寻找一个应该类似于 AF_UNIX 套接字的 AF_MAP 套接字。 我如
对于 Python 中的 AF_UNIX 套接字,“客户端地址”的含义是什么? sock = socket.socket( socket.AF_UNIX, socket.SOCK_STREAM ) s
这个问题在这里已经有了答案: AF_UNIX in windows (3 个答案) 关闭 4 年前。 我想知道如何在 Windows 上使用类似于 Unix Domain Socket 的东西。 行
我很好奇 AF_UNIX SOCK_STREAM 套接字的默认协议(protocol)是什么。我正在尝试准确追踪数据包开销应该是多少,但我无法弄清楚默认情况下使用的是什么协议(protocol)。我怀
我有一个希望在 Windows 上使用的应用程序。我正在使用 AF_UNIX 系列 un windows。我想知道 AF_UNIX 系列在 Windows 中可用。如果没有,那么是否有 AF_UNIX
我正在用 C 编写一些套接字函数,但遇到了这个问题。我有一个包含三个字段的结构: typedef struct { char type; unsigned int leng
我是一名优秀的程序员,十分优秀!