小编Fan*_*ier的帖子

套接字编程:recv/read问题

编辑:下面的代码已被修复,以正确接收和发送和记录发送和收到的消息的实际字节(后者归功于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 sockets recv

10
推荐指数
1
解决办法
1万
查看次数

UDP和套接字,recvfrom()返回-1,资源暂时不可用

我有一个客户端和服务器与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 sockets client udp

8
推荐指数
1
解决办法
2万
查看次数

c分配不兼容的类型,指针问题?

嗨,我正在使用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 * …

c struct pointers void

6
推荐指数
2
解决办法
1万
查看次数

C 套接字编程:connect() 挂起

大家好,我要扯头发了。我有一个尝试连接到服务器的客户端,使用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)

c connection client-server

4
推荐指数
1
解决办法
2万
查看次数

TCP/UDP和以太网MTU碎片

我在线阅读了各种网站和教程,但我仍感到困惑.如果消息大于IP MTU,则send()返回发送的字节.消息的其余部分会发生什么?我是否send()再次打电话并尝试发送其余信息?或者是IP层应该自动处理的东西?

c tcp fragmentation send mtu

3
推荐指数
1
解决办法
2918
查看次数

关于Time.h结构的成员有些奇怪

可能重复:
为什么tm_sec在time.h中的范围是0-60而不是0-59?

所以当我查找<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 time.h

2
推荐指数
1
解决办法
165
查看次数

寻找一个不做任何事情/等待的功能

对于C,是否有一个函数接受一个int并且不执行下一个语句?

printf("a");
wait(500);
printf("b");
Run Code Online (Sandbox Code Playgroud)

打印完毕后500分钟后打印出来.某种东西.抱歉这个愚蠢的问题,但我不知道如何去寻找这样的功能.

c

1
推荐指数
1
解决办法
141
查看次数

对recv()感到困惑

请原谅,如果这个问题已得到解答,但我找不到.

我有点困惑recv()recvfrom().一旦服务器绑定地址(或接受TCP的连接),recv()就会被调用.是否recv()经常检查已发送的消息或是否等到收到消息?如果等待,等待时间有多长?

不确定我是否有意义,但如果有人能够启发我,我将不胜感激.

c sockets client recv

1
推荐指数
1
解决办法
432
查看次数

执行一切后,在程序结束时出现故障?

我写了一个快速程序,在给出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)

c segmentation-fault

0
推荐指数
1
解决办法
7066
查看次数