Tag: 套接字

为什么我在尝试接受连接时遇到“无效参数”?

在下一个代码中,当我尝试连接客户端时,服务器显示以下错误:“无效参数”,我看不到错误。 if((l_sock=socket(AF_INET,SOCK_STREAM,0))!=-1) { struct sockaddr_in srv_dir; srv_dir.sin_family=AF_INET; srv_dir.sin_port=8500; srv_dir.sin_addr.s_addr=INADDR_ANY; if((bind(l_sock,(struct sockaddr *)&srv_dir,sizeof(struct sockaddr_in)))!=-1) { if(!(listen(l_sock,5))) { signal(SIGINT,cerraje); int t_sock; struct sockaddr_in cli_dir; socklen_t tam; time_t tstmp; struct tm * res; res=(struct tm *)malloc(sizeof(struct tm)); while(!key) { if((t_sock=accept(l_sock,(struct sockaddr *)&cli_dir,&tam))!=-1) { tstmp=time(&tstmp); res=gmtime(&tstmp); send(t_sock,res,sizeof(struct tm),0); wr_hora(*res,cli_dir.sin_addr); } else perror(“Petición no atendida”);//The error is printed here. 非常感谢你。

从套接字C HTTP读取

我想知道如何判断是否已从套接字接收到所有数据。 这是一个简单的Web代理,现在我正在处理请求部分,所以发送的内容应该以’\ r \ n \ n \ n \ n’终止。我不知道请求会有多长。 我在这里读了一些post说我应该检查读取函数返回的0? 但其他说0的人只有在客户关闭连接时才会返回? 否则我可以检查缓冲区的最后一个字符,看看它们是否与上面的字符匹配? 计划只是将读取的数据加载到缓冲区中,如果有更多的数据重复,则保存该数据。 谢谢

Linux,C,epoll(),read()数据未完成?

Linux,C。下面的问题只发生在使用epoll()。 如果我在服务器套接字上使用select(),则不会丢失数据。 ============================= 更新:我在read()中收到了errno = 11(再试一次)。 我需要继续,还是打破while循环? ============================= 我有客户端,10次发送1280 K数据(每次发送128K数据); 我有服务器端,使用epoll()来监视传入的数据。 收到通知后,我使用下面的代码来读取数据: nbytes = Nread(current_fd, buffer, bytes_to_be_read); int Nread(int fd, char *buffer, size_t count) { ssize_t r; size_t left = count; printf(“===>\n”); while (left > 0){ r = read(fd, buffer, left); printf(“data: %ld\n”, r); if (r done, %ld\n”, total – left); return count – left; […]

inet_ntoa使用奇怪的printf行为

#include #include #include #include #include int main(int argc, char **argv) { struct sockaddr_in X = {0}; X.sin_family = AF_INET; X.sin_addr.s_addr = inet_addr(“127.0.0.1”); X.sin_port = htons(8080); struct sockaddr_in Y = {0}; Y.sin_family = AF_INET; Y.sin_addr.s_addr = inet_addr(“212.43.159.20”); Y.sin_port = htons(80); printf(“X:Y %s:%s\n”, inet_ntoa(X.sin_addr), inet_ntoa(Y.sin_addr)); printf(“X %s\n”, inet_ntoa(X.sin_addr)); printf(“Y %s\n”, inet_ntoa(Y.sin_addr)); return 0; } 为什么第一个pritnf打印相同的IP两次而不是给出什么? 第二和第三似乎没问题。 似乎发生在linux […]

检查套接字文件描述符是否可用?

如果我有一个文件描述符(socket fd),如何检查这个fd是否可用于读/写? 在我的情况下,客户端已连接到服务器,我们知道fd。 但是,服务器会断开套接字,是否有任何检查线索?

将小型UDP数据包从Linux内核发送到LOOPBACK

情况:我的代码基本上被黑客入侵了Linux内核的驱动程序。 我想在用户空间中通知一个关于值得注意的原始事件的应用程序,然后才能将它们发送到主系统。 解决方案的步骤:我在这里找到了一个从内核空间发送UDP数据包的好例子: http : //kernelnewbies.org/Simple_UDP_Server 。 他们使用INADDR_LOOPBACK作为目标地址,这正是我想要的。 由于这是中断上下文,我决定使用工作队列来发送数据包(我得到了BUG:在没有它的情况下进行primefaces调度)。 因此,我的发送代码基于kernelnewbies代码,该代码包含在主进程中使用INIT_WORK和schedule_work触发的工作队列结构中。 我没有宣布自己的工作队列。 我没有使用Netpoll API,因为此问题表明无法从localhost发送数据。 “你不能发给自己” 问题:从内核发送并从我的UDP接收器接收的数据很少匹配。 我不知道为什么会这样。 用于测试的虚拟数据的代码,包括工作队列的结构的定义: static struct socket *sock_send; static struct sockaddr_in addr_send; static struct ksocket_workmessage { unsigned char *buf; int len; struct work_struct workmessage; } workmsg; unsigned char testmsg[] = {‘T’, ‘e’, ‘s’, ‘t’, ‘i’, ‘n’, ‘g’, ‘m’, ‘s’, ‘g’, ‘\0’}; workmsg.buf […]

连接到套接字时似乎无法使超时工作

我正在尝试为connect()提供超时。 我四处搜寻,发现了几篇与此相关的文章。 我编写了我认为应该工作的内容,但不幸的是我没有从getsockopt()报告错误。 但是当我来到write()时,它失败了,错误是107 – ENOTCONN。 几点。 我在Fedora 23上运行.connect()的文档说它应该返回失败的EINPROGRESS错误,因为连接尚未完成但是我遇到了EAGAIN所以我将其添加到我的支票中。 目前我的套接字服务器在listen()调用中将backlog设置为零。 许多调用成功但是那些失败的调用都失败了107 – 我在write()调用中提到的ENOTCONN。 我希望我只是遗漏了一些东西,但到目前为止还无法弄清楚是什么。 int domain_socket_send(const char* socket_name, unsigned char* buffer, unsigned int length, unsigned int timeout) { struct sockaddr_un addr; int fd = -1; int result = 0; // Create socket. fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) { result = -1; […]

通过C套接字发送原始二进制数据?

我正在努力通过C中的套接字发送加密数据。一切正常,直到我意识到发送的数据的大小比它应该的大得多。 下面的代码描述了这种情况: #include #include #include int main() { char temp[100], buffer[100]; int n = 1234567890; sprintf(temp, “%d”, n); printf(“Original n has size: %d\n”, sizeof(n)); // 4 printf(“Buffer size: %d\n”, strlen(temp)); //10 printf(“Buffer: %s”, temp); } 问题是原始数字存储为4字节整数,而缓冲区是逐字符存储的,因此通过套接字发送的不是4个字节,而是一个字节字符的10s。 我想知道有没有办法将二进制数据作为原始数据发送?

接收UDP数据包时是否可以读取TTL IP头字段?

我正在使用UDP套接字发送数据包,我想检查收到的数据包的IP头中的TTL字段。 可能吗? 我注意到IP_HDRINCL sockoption但它似乎只适用于RAW套接字。

中断接受()

是否有OS可移植的方式来中断阻塞accept ? 我有一个multithreadingdeamon /服务,当deamon / service获得关闭信号时,需要正常关闭所有侦听网络主机。 我看到有人说你应该使用非阻塞套接字或选择超时 – 但这些会不会降低性能,因为我的应用程序应尽可能快? 守护进程在主线程中运行,而每个侦听网络主机都在自己的线程中运行。 现在的问题是,如果侦听网络主机的套接字上没有网络流量,则accept无限期等待。 如果我应该使用信号,那么有一个使用信号来中断accept的例子吗?