编辑:下面的代码已被修复,以正确接收和发送和记录发送和收到的消息的实际字节(后者归功于EJP)
我在Unix中用C编程.
我有服务器和客户端应该交换消息.虽然客户端似乎发送消息很好,但服务器不会收到客户端发送的消息.我已经尝试使用recv()和read()(我知道他们实际上是相同的事情,但有额外的旗帜上recv()),但我有没有运气,我真的不知道真正的问题是什么.
我把sleep(3)每一个时间后它会发送消息的客户端代码,但我看到,一旦客户端和服务器连接时,服务器会立即关闭,而不必等待传入的消息.我究竟做错了什么?
这是客户端代码:
#define SERVER_TCP_PORT 11112
#define MAX_DATA_SIZE 500
int main(int argc, char * argv[])
{
int sockfd;
char * host;
char msg[MAX_DATA_SIZE];/* = "get my msg!\n";*/
int msg_len;
struct hostent * hp;
struct sockaddr_in client_address, server_address;
printf("y halo thar\n");
// looking up from the host database
if (argc == 2)
host = argv[1];
else
exit(1);
printf("sdf\n");
hp = gethostbyname(host);
if (!hp)
exit(1);
printf("host found\n");
// setting up address …Run Code Online (Sandbox Code Playgroud) 我有一个客户端和服务器与C中的数据报(UDP)通信.客户端发送5个消息,并在收到消息后,服务器发回消息.在客户端完成接收消息之前,接收和发送消息是很好的.服务器发回所有消息后,它将使用close()终止.所以来自客户端的recvfrom()应该返回0,对吗?
假设recvfrom()应该在服务器端close()时返回0,它返回-1,而错误资源暂时不可用.此资源是否从服务器引用了已关闭的套接字?或者它是否为完全不同的东西,比如用完缓冲区或其他东西(我不认为是真的)?
假设我的假设是错误的,并且因为服务器终止而返回-1,我可能应该处理错误
if(SOMEMACRO)
do something
Run Code Online (Sandbox Code Playgroud)
我怎么知道SOMEMACRO是什么?我打印出错误,但它说资源临时不可用,recvfrom()描述没有提到无法使用的资源..?
顺便说一句,这是一个非阻塞套接字,如果这有任何区别,因为我读到如果设置O_NONBLOCK并且没有可用的消息,它会将errno设置为EAGAIN或EWOULDBLOCK.未设置O_NONBLOCK但设置了MSG_DONTWAIT.它们基本上是相同的东西,其中O_NONBLOCK用于一般文件描述符,而MSG_DONTWAIT是特定于套接字的吗?
我的大脑现在没有那么好用,如果有人可以启发我并澄清我的困惑,我会深深体会到这一点.谢谢!
嗨,我正在使用C,我有一个关于分配指针的问题.
struct foo
{
int _bar;
char * _car[SOME_NUMBER]; // this is meant to be an array of char * so that it can hold pointers to names of cars
}
int foofunc (void * arg)
{
int bar;
char * car[SOME_NUMBER];
struct foo * thing = (struct foo *) arg;
bar = thing->_bar; // this works fine
car = thing->_car; // this gives compiler errors of incompatible types in assignment
}
Run Code Online (Sandbox Code Playgroud)
car和_car有相同的声明,为什么我收到有关不兼容类型的错误?我的猜测是它与指针有关(因为它们是指向char*数组的指针,对吧?)但我不明白为什么这是一个问题.
当我宣布char * car;而不是char * …
大家好,我要扯头发了。我有一个尝试连接到服务器的客户端,使用gethostbyname(), socket(), bind(),一切似乎都很好,但是当尝试它时,connect()它只是挂在那里,服务器看不到来自客户端的任何内容。我知道服务器可以正常工作,因为另一个客户端(也在 C 语言中)可以正常连接。是什么导致服务器看不到此传入连接?我已经无计可施了。这两个不同的客户也非常相似,所以我更加迷失了。
if (argc == 2) {
host = argv[1]; // server address
}
else {
printf("plz read the manual\n");
exit(1);
}
hserver = gethostbyname(host);
if (hserver) {
printf("host found: %p\n", hserver);
printf("host found: %s\n", hserver->h_name );
}
else {
printf("host not found\n");
exit(1);
}
bzero((char * ) &server_address, sizeof(server_address)); // copy zeroes into string
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(hserver->h_addr);
server_address.sin_port = htons(SERVER_PORT);
bzero((char * ) &client_address, sizeof(client_address)); // copy …Run Code Online (Sandbox Code Playgroud) 我在线阅读了各种网站和教程,但我仍感到困惑.如果消息大于IP MTU,则send()返回发送的字节.消息的其余部分会发生什么?我是否send()再次打电话并尝试发送其余信息?或者是IP层应该自动处理的东西?
所以当我查找<time.h>一些信息时,我遇到了这个问题.我假设方括号中的数字是结构的每个相应成员可能的范围.那么为什么秒可能有0~61个可能的范围?每分钟有62秒,我是唯一一个不知道的人吗?
int tm_sec seconds [0,61] // <-- this part is weird
int tm_min minutes [0,59]
int tm_hour hour [0,23]
int tm_mday day of month [1,31]
int tm_mon month of year [0,11]
int tm_year years since 1900
int tm_wday day of week [0,6] (Sunday = 0)
int tm_yday day of year [0,365]
int tm_isdst daylight savings flag
Run Code Online (Sandbox Code Playgroud) 对于C,是否有一个函数接受一个int并且不执行下一个语句?
printf("a");
wait(500);
printf("b");
Run Code Online (Sandbox Code Playgroud)
打印完毕后500分钟后打印出来.某种东西.抱歉这个愚蠢的问题,但我不知道如何去寻找这样的功能.
请原谅,如果这个问题已得到解答,但我找不到.
我有点困惑recv()和recvfrom().一旦服务器绑定地址(或接受TCP的连接),recv()就会被调用.是否recv()经常检查已发送的消息或是否等到收到消息?如果等待,等待时间有多长?
不确定我是否有意义,但如果有人能够启发我,我将不胜感激.
我写了一个快速程序,在给出seg错误之前执行每个语句.
struct foo
{
int cat;
int * dog;
};
void bar (void * arg)
{
printf("o hello bar\n");
struct foo * food = (struct foo *) arg;
printf("cat meows %i\n", food->cat);
printf("dog barks %i\n", *(food->dog));
}
void main()
{
int cat = 4;
int * dog;
dog = &cat;
printf("cat meows %i\n", cat);
printf("dog barks %i\n", *dog);
struct foo * food;
food->cat = cat;
food->dog = dog;
printf("cat meows %i\n", food->cat);
printf("dog barks %i\n", *(food->dog));
printf("time for foo!\n");
bar(food); …Run Code Online (Sandbox Code Playgroud)