- 假设一台计算机是服务器,另一台是客户端。那么,应该将服务器代码放在服务器计算机上,将客户端代码放在客户端计算机上吗?
- 在提供bind()的ip地址时,服务器代码中应该是我们可以通过ipconfig找到的系统的ip地址,还是仍然保持回环地址呢?
- 在客户端代码中,目标的ip地址应该是服务器计算机的ip地址,对吗?
- 最后也是最重要的一点,我该如何连接这两台计算机?
服务器代码:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#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<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<string.h>
#include<stdio.h>
#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;
}
getaddrinfo
、getnameinfo
、socket
、bind
、connect
、listen
、accept
、sendto
、recvfrom
和select
的手册(或POSIX文档,在此处:http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html)就是你所需要的全部。在旧的示例和教程中看到的所有复杂性都只是遗留负担,并且对IPv6支持和可移植性是一种妨碍。 - R.. GitHub STOP HELPING ICEbind
分配一个端口号,然后使用getsockname
和getnameinfo
记录并发布给客户端使用。 - R.. GitHub STOP HELPING ICEgetaddrinfo()
时,应该始终循环遍历所有结果,并为每个监听地址创建一个套接字。如果你只想简单地做IPv4中的 任何 地址,则没有理由从一开始就使用getaddrinfo()
。你的代码可能会导致意外情况,这取决于系统配置。 - Pavel Šimerda