Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ubuntu中C语言的Socket编程_C_Sockets_Unix - Fatal编程技术网

Ubuntu中C语言的Socket编程

Ubuntu中C语言的Socket编程,c,sockets,unix,C,Sockets,Unix,我正在学习ubuntu中的socket程序,为此我编写了以下服务器-客户端通信程序。程序没有打开端口。我还有一些关于服务器-客户端通信的其他问题: 当服务器接受客户机请求时,服务器是否在接受请求时就开始从客户机读取数据? u_connect和u_accept返回的文件描述符是否相同?我找不到它,因为我的端口没有打开 由于我在同一台计算机上测试服务器-客户端对话,我可以使用随机数作为端口吗? 我正在使用一个包含用于套接字编程的OS函数的 代码如下: 服务器.c int main() { cha

我正在学习ubuntu中的socket程序,为此我编写了以下服务器-客户端通信程序。程序没有打开端口。我还有一些关于服务器-客户端通信的其他问题:

当服务器接受客户机请求时,服务器是否在接受请求时就开始从客户机读取数据? u_connect和u_accept返回的文件描述符是否相同?我找不到它,因为我的端口没有打开 由于我在同一台计算机上测试服务器-客户端对话,我可以使用随机数作为端口吗? 我正在使用一个包含用于套接字编程的OS函数的

代码如下:

服务器.c

int main()
{
  char client[50];
  char buf[1024];
  u_port_t portnumber;
  portnumber = 4862;
  int fd = u_open(portnumber);
  int communFd = u_accept(fd, client, 50);
  printf("Opened com %d\n\n", communFd);
  fprintf(stderr, "\nComun fd is %d\n\n\n", communFd);
  read(communFd, buf, 1024);
  write(STDOUT_FILENO, buf, 1024);
  fprintf(stderr, "\n\nReading complete\n");
  return 0;
}
客户c

int main()
{
  u_port_t portnumber;
  portnumber = 4862;
  char client[] = "Alfred";
  char buf[1024];
  int communFd = u_connect(portnumber, client);
  printf("comun is %d\n", communFd);
  read(STDIN_FILENO, buf, 1024);
  write(communFd, buf, 1024);
  return 0;
}
当服务器接受客户机请求时,服务器是否开始读取 从客户端接受请求的那一刻起

当客户端通过写入发送的数据被接收并进入套接字读取缓冲区时,服务器可以读取

u_connect和u_accept返回的文件描述符是否相同?我 找不到,因为我的端口未打开

不可以。即使服务器端和客户端在同一进程中运行也不行

既然我正在测试服务器客户端,我可以使用随机数作为端口吗 在同一台计算机上交谈

您可以在0到65535之间的端口上绑定。 0到1024之间的端口称为已知端口,IANA已将其分配给特定的服务。我的建议是使用49152-65535范围内的端口号,但没有人禁止您使用低值

如果端口被另一个进程绑定,它将返回一个错误代码。试试另一个

这是错误的

read(communFd, buf, 1024);
write(STDOUT_FILENO, buf, 1024);
您应该这样做:

ssize_t r;
size_t space_left = 1024
while ((r=read(communFd, buf, space_left))>0) {
    space_left-=r;
    write(STDOUT_FILENO,buf,r);
}

因为在一次写入中发送的内容可能会在网络上分散,并通过多次读取进行检索

首先,我建议不要使用该包装器,因为它使用了一些非常古老的技术。我建议您阅读、和并滚动您自己的POSIX套接字代码。你会得到更好的理解。我也建议阅读。也许一本书甚至可以派上用场

否。读取功能进行读取,而不是服务器。在这一点上,将read的返回值存储在某处并找出它的重要意义是一个好主意。如果你像我们许多人一样相信阅读是一种比反复试验更有效的机制,那么这本手册就是。 否。u_open似乎返回一个服务器套接字,其中的read不是有效操作,但accept是。u_accept似乎返回对等套接字,其中accept不是有效的操作,但read是。 当然,如果端口大于1024,则小于1024通常需要超级用户权限,小于65535,并且端口尚未绑定到。
我认为使用不知名的第三方套接字库会使这个问题更加本地化。你必须检查错误。POSIX系统(如Linux)上的系统调用通常在出错时返回-1。您可以检查全局变量的值以查看错误。您可以使用来打印带有错误的消息。@unwind我说的包装器包装了C套接字函数。就像u\u connect包含*nix connect函数一样。@jamesafled:u\u connect还做其他事情。它的文档说,如果失败,它将返回-1并设置errno变量。您可能需要检查其中的内容,因为程序没有打开端口。在上面提供的程序中,客户端将数据写入connect函数返回的文件描述符中,服务器从u_accept返回的文件描述符中读取数据。如果文件描述符不相同,服务器从何处读取客户端写入的数据?这些文件描述符不相同如果我们讨论的是两个不同的进程,它们怎么可能相同?但它们是通过TCP进行逻辑连接的。不管怎样,我潜入了图书馆。。。我认为您应该使用localhost作为静态字符串,而不是客户端[]阵列中的Alfred。您能告诉我什么是主机名及其在套接字编程中的作用吗?如果您查看库,例如u_connect函数,您将看到主机名将通过函数name2addr转换为ip地址。套接字只能使用普通ip地址,不能使用名称,因此必须转换主机名。localhost是标准主机名,用于指示当前主机我知道localhost是给定库的标准主机名。我仍然对套接字编程中主机名的用途感到困惑。我的意思是套接字与IP和其他东西一起工作,那么主机名做什么呢?问题不是读取或写入数据。这是一个测试程序,我在其中测试服务器和客户端如何连接。但是客户端没有与服务器连接。我不想检查您的特殊库。如果你不使用普通的,你自己做。不管怎样,我已经指出的是一个问题,你只是没有击中它,因为你的连接也不工作。