Linux 网络编程一步一步学(二)-绑定IP 和端口
1 #include <stdio.h> 2 #include <string.h> 3 #include <errno.h> 4 #include <sys/socket.h> 5 #include <resolv.h> 6 #include <stdlib.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 #include <unistd.h> 10 #define MAXBUF 1024 11 int main(int argc, char **argv) - 12 { | 13 int sockfd; | 14 struct sockaddr_in dest, mine; | 15 char buffer[MAXBUF]; - 16 if (argc != 5) { 2 17 printf("参数格式错误!正确用法如下:\n\t\t%s 对方IP 地址 对方端口 本机IP 地址 本机端口\n\t比如:\t%s 127.0.0.1 82 0\n此程序用来以本机固定的端口从某个 IP 地址的服务器某个端口接收最多MAXBUF 个字节的消息",argv[0], argv[0]); 2 18 exit(0); 2 19 } | 20 /* 创建一个 socket 用于 tcp 通信 */ - 21 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 2 22 perror("Socket"); 2 23 exit(errno); 2 24 } | 25 /* 初始化服务器端(对方)的地址和端口信息 */ | 26 bzero(&dest, sizeof(dest)); | 27 dest.sin_family = AF_INET; | 28 dest.sin_port = htons(atoi(argv[2])); - 29 if (inet_aton(argv[1], (struct in_addr *) &dest.sin_addr.s_addr) == 0) { 2 30 perror(argv[1]); 2 31 exit(errno); 2 32 } | 33 /* 初始化自己的地址和端口信息 */ | 34 bzero(&mine, sizeof(mine)); | 35 mine.sin_family = AF_INET; | 36 mine.sin_port = htons(atoi(argv[4])); - 37 if (inet_aton(argv[3], (struct in_addr *) &mine.sin_addr.s_addr) == 0) { 2 38 perror(argv[3]); 2 39 exit(errno); 2 40 } | 41 /* 把自己的 IP 地址信息和端口与 socket 绑定 */ - 42 if (bind(sockfd, (struct sockaddr *) &mine, sizeof(struct sockaddr)) == -1) { 2 43 perror(argv[3]); 2 44 exit(errno); 2 45 } | 46 /* 连接服务器 */ - 47 if (connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) != 0) { 2 48 perror("Connect "); 2 49 exit(errno); 2 50 } | 51 /* 接收对方发过来的消息,最多接收 MAXBUF 个字节 */ | 52 bzero(buffer, MAXBUF); | 53 recv(sockfd, buffer, sizeof(buffer), 0); | 54 printf("%s", buffer); | 55 sleep(10); | 56 /* 关闭连接 */ | 57 close(sockfd); | 58 return 0; | 59 } 60
1、bind() 函数可以帮助你指定一个套接字使用的端口
当你使用socket() 函数得到一个套接字描述符,需要将socket 绑定上一个你的机器上的端口。当你需要进行端口监听 listen()操作,等待接受一个连入请求的时候,一般都需要经过这一步。比如网络泥巴(MUD),Telnet a.b.c.d 4000。如果你只是想进行连接一台服务器,也就是进行 connect() 操作的时候,这一步并不是必须的。
int bind (int sockfd , struct sockaddr *my_addr , int addrlen) 参数说明:
sockfd 是由socket()函数返回的套接字描述符。
my_addr 是一个指向struct sockaddr 的指针,包含有关你的地址的信息:名称、端口和IP 地址。
addrlen 可以设置为sizeof(struct sockaddr)。