Tag: sockets

如何在c socket程序中将struct变量复制到缓冲区?

在客户端,我需要从网络接收数据包并将其写入一个文件,该文件将被发送到服务器以进行进一步处理。 接收和处理数据包时出现问题,因为我曾经在write()api中只发送一个不是’saddr’的缓冲区和’size’。 因此我使用结构来声明所有成员,如buffer,saddr,saddr_size。 这是我的data_capture代码: int logfile; struct sockaddr_in source, dest; struct fields{ //edited void* b; struct sockaddr *s; socklen_t *ssize; }data; int main() { int saddr_size, data_size; struct fields data; struct sockaddr saddr; gopromiscous(); unsigned char *buffer = (unsigned char *) malloc(1024); logfile = open(“sniff_data.bin”, O_CREAT | O_WRONLY | O_APPEND, 0777); if (logfile == -1) […]

管道损坏错误

我在FTP实现中的打开的数据套接字上使用write()来发送文件。 但在写完一些数据之后,它已经悬挂了一段时间; 然后它返回Broken管道错误。 任何帮助都将非常感谢。 我的进程从一个buff读取数据包并写入套接字。 我注意到带宽增加的问题。 如果我增加了要处理的数据包的数量,那么问题就出现了。 我正在使用FreeBSD。 我使用两个线程一个读取数据包并写入缓冲区…第二个线程从缓冲区读取这些数据包并写入套接字。 谢谢你的帮助亚历山大

从类型int分配类型char 时编译“不兼容类型”的错误

我有上面提到的编译错误。 代码行是这样的: if ((strcmp(tempDept, data[1].Dept)==0) && tempCourse == data[i].course){ if (tempDay = data[i].meet_days && tempTime == data[i].start.hour){ //<—This line printf("this worked"); } } 这是我的结构声明: typedef enum {MW, TR} days; typedef struct { int hour, min; } Time; typedef struct { char Dept[5]; int course, sect; days meet_days; Time start, end; char instr[20]; } sched_record; 这是我的变量列表: […]

为什么关闭套接字不能让select()返回?

在我的程序中,在侦听套接字上有一个线程阻塞,它等待其他连接,代码喜欢这样: { …… FD_ZERO(&fd_sets); FD_SET(sock_fd, &fd_sets); ret_val = select(sock_fd + 1, &fd_sets, NULL, NULL, NULL); if (ret_val > 0) { accept(sock_fd, NULL, NULL); …… } else { …… } 根据我的理解,如果在其他线程中,关闭套接字,代码喜欢这样: { …… shutdown(sock_fd, SHUT_RD); …… } 我认为前一个线程中的select()应该返回。 但经过测试,我发现select()仍处于阻塞状态。 为什么关闭套接字不能让select()返回?

Linux上的UDP套接字; 发送成功但无法接收大缓冲区

我有两台机器,我希望它们都能在C编程语言下使用套接字进行通信。 我已经开发了两个样本来代表双方,但我注意到如果它们小于一定数量我可以成功发送数据。 我测试但不起作用的大小是发送和接收2048字节,相反,对于其他较小的大小,如258字节,1KByte它工作正常。 在做了一些调查后,我发现,发送操作没有错误,而对于接收,我根本没有得到任何东西。 我检查了两台机器上的发送和接收缓冲区大小,我猜它们已经足够了。 以下是我的代码的第一面: /* UDP client in the internet domain */ #include #include #include #include #include #include #include #include #include #include #define BUFF_SIZE 1800 #define MOBIPASS_L2_IP_ADDRESS “192.168.13.53” #define MOBIPASS_L2_PORT_NUM 12001 #define BRIDGE_IP_ADDRESS “192.168.13.30” #define BRIDGE_PORT_NUM 12000 #define RESTRICT_SRC_DST_NUM 1 #define TEN_MSEC 10000 void error(const char *); void adjustSockParam (int sockFD); int main(int […]

套接字编程出错以及在C中使用htonl(),htons()函数

我在下面粘贴我的客户端和服务器代码。 我的程序运行正常,除了我试图在我的src和dest字段中发送一个ipaddress,并且由于某种原因,即使我发送它为131.199.166.232,它打印为232.166.199.131。 但其余的数据包值以适当的方式打印。 我已经使用了memcpy(),所以我觉得它是一个memcpy的东西,在某个地方我做错了,但在Beej的指南中,因为有一个部分@在不同的计算机体系结构中的字节排序…..我没有使用过htonl()所有,也许是因为这个。请指导我,因为我出错了。 另外请告诉我发送数据的方式,如何在我的代码中使用htonl()函数….提前感谢。 客户: #include #include #include #include #include #include #include #include #define MAXPROFILES 2 int main(int argc, char *argv[]) { int sockfd, portno, n; struct sockaddr_in serv_addr; struct hostent *server; unsigned char buf[1024]; unsigned int srcAddress = 2193598184; unsigned int destAddress = 2193598182; struct profile_t { unsigned char length; unsigned char type; […]

套接字编程中的标头

我正在编写我的第一个套接字行,并且已经完成了创建一个在其间传输消息的客户端服务器系统。 下一步是让一个标题播种接收者知道消息的数据量以及消息的数据。 我怎么能做到这一点? 我希望标头包含两个int: int to_phone_number; int size; 怎么能发送标题? send(sock, the_message, max_message_length, 0);

从套接字读取直到某个字符在缓冲区中

我试图从套接字读入缓冲区,直到使用read(fd, buf, BUFFLEN)到达某个字符。 例如,套接字将在一次读取调用中接收由空行分隔的两批信息。 是否可以将读取调用置于循环中,以便在到达此空行时停止,然后如果需要,它可以在以后读取其余信息?

如何确定套接字是否已关闭

我有一个简单的客户端服务器程序,但主要问题是,一旦在客户端和服务器之间建立连接,如果客户端关闭程序,服务器会重复执行最后一条消息,这有时会产生巨大的问题。 所以我想要的是,如果有任何函数可以调用以获取SOCKET结构的状态,那么如果客户端关闭程序,服务器将知道停止。 我只需要从函数查找错误套接字的函数。 顺便说一句,我在Win32 c中编写这个程序。 我试过if(mySocket == SOCKET_ERROR)似乎不起作用……除非我用错了。 我刚刚开始联网。 if(!sockServer.RecvData( recMessage, STRLEN )){return 0;} // where bool Socket::RecvData( char *buffer, int size ) { int i = recv( mySocket, buffer, size, 0 ); if(!i){return false;} buffer[i] = ‘\0’; return true; } //this isn’t working

如何初始化struct sockaddr_in的变量

当我初始化变量时,我确实吼叫。 int i = 0; char *myText = NULL; 然后,我可以初始化struct sockaddr_in类型变量吗? struct sockaddr_in addr = ?;