初学者的C语言编程

我刚刚开始学习套接字编程,我发现它非常有趣。 目前我在同一台计算机上制作服务器和客户端,因此我可以将ip地址作为环回地址,127.0.0.1,一切似乎工作正常!

但是现在我想要有两台电脑并做这件事……我有以下问题 – 1)说一台电脑是服务器而另一台是客户端。 现在,如果服务器代码驻留在服务器计算机上,客户端代码应该驻留在客户端上吗? 2)在我们为bind()提供ip地址的服务器代码中,它应该是我们可以通过ipconfig找到的系统的ip地址,还是应该仍然是环回地址? 3)在客户端代码中,我猜目的地的IP地址应该是服务器计算机的IP地址吗? 4)最后也是最重要的事情,我如何连接两台计算机?

我附加了我开始使用的简单服务器和客户端消息传递代码。 请引导我完成我需要做出的改变..

服务器代码

#include  #include  #include  #include  #include  #include  #define MYPORT 3500 int main() { int sockfd; int clientfd; int bytes_read; char buf[100]; int struct_size; struct sockaddr_in my_addr; struct sockaddr_in con_addr; sockfd = socket(AF_INET, SOCK_STREAM, 0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(MYPORT); my_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); my_addr.sin_zero[8]='\0'; bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)); listen(sockfd,5); struct_size = sizeof(con_addr); clientfd = accept(sockfd, (struct sockaddr*)&con_addr, &struct_size); bytes_read = read(clientfd, buf, 100); buf[bytes_read] = '\0'; printf("Message from client:%d is %s \n",clientfd, buf); close(sockfd); close(clientfd); } 

客户代码

 #include #include #include #include #include #include #define DESTPORT 3500 int main() { struct sockaddr_in dest_addr; int sockfd = socket(AF_INET,SOCK_STREAM,0); dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(DESTPORT); dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); dest_addr.sin_zero[8]='\0'; connect(sockfd,(struct sockaddr*)&dest_addr, sizeof(struct sockaddr)); char msg[100]; printf("Enter you message: "); gets(&msg); int w = write(sockfd, msg, strlen(msg)); close(sockfd); printf("Client Dying.....\n"); return 0; } 

服务器应bind0.0.0.0 (任何),除非您尝试限制访问(在这种情况下,您应该使用防火墙而不是端口绑定)。 实际上正确的方法是:

 struct addrinfo *ai, hints = { .ai_flags = AI_PASSIVE }; if (getaddrinfo(0, "1234", &hints, &ai)) goto error; int fd = socket(ai->ai_family, SOCK_STREAM, 0); bind(fd, ai->ai_addr, ai->ai_addrlen); 

当然,添加一些错误检查。 将“1234”替换为您的端口号。

1)正确。

2)在服务器端,您可以绑定到0.0.0.0,这意味着“所有(IPv4)接口”。

3)是的,你是对的。

4)最常见的是通过以太网交换机(或交叉以太网电缆,但更难找到)。

127.0.0.1是localhost您当前所在机器的环回地址。 如果您使用两个单独的框,您可能希望将其更改为客户端中的真实IP。

是的,客户端通常(但不总是)位于服务器的另一个物理盒上。 如果需要,您可以在omne框上运行两个部分

1)假设一台计算机是服务器而另一台是客户端。 现在,如果服务器代码驻留在服务器计算机上,客户端代码应该驻留在客户端上吗?

我不认为我从正确的角度理解这个…大声笑。如果你的客户端代码在服务器端,你如何分配任何内存批量或调用客户端计算机上的东西?

2)在我们为bind()提供ip地址的服务器代码中,它应该是我们可以通过ipconfig找到的系统的ip地址,还是应该仍然是环回地址?

我们在手册页上有什么:

  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 

“bind()将addr指定的地址分配给文件描述符sockfd引用的套接字.addrlen指定addr指向的地址结构的大小(以字节为单位)。传统上,此操作称为”为套接字“。通常需要在SOCK_STREAM套接字可以接收连接之前使用bind()分配本地地址(请参阅accept(2))。”

在你的情况下,我想,你正在寻找127.0.0.1。简而言之,你所谈到的地址更可能是你设置为server_addr结构的地址。

3)在客户端代码中,我猜目的地的IP地址应该是服务器计算机的IP地址吗?

是。

4)最后也是最重要的事情,我如何连接两台计算机?

听起来像一个经典的聊天室应用程序。 据我所知(我是一个新手…),UDP(用户数据报协议)编程和API值得一试。如果你想坚持TCP / IP,两个任意计算机基本上不连接到每个另外,但两者都与服务器保持一致,服务器将成为它们之间的基石。

更重要的是,我查看了一些socket手册页:

  int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 

“connect()系统调用将文件描述符sockfd引用的套接字连接到addr指定的地址.addrlen参数指定addr的大小.addr中的地址格式由套接字sockfd的地址空间决定。 ;有关详细信息,请参阅socket(2)。“

我认为这完全以理论的方式解释了你的问题。