TCP客户端程序
此客户端程序(client_v1.cpp)功能是从命令行参数中获得一个字符串发给服务器,然后接收服务器返回的字符串并打印:
//client_v1.cpp
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdlib>
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[])
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd, n;
char *str;
if (argc != 2)
{
fputs("usage: ./client message\n", stderr);
exit(1);
}
str = argv[1];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT);
connect(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr));
write(sockfd, str, strlen(str));
n = read(sockfd, buf, MAXLINE);
printf("Response from server:\n");
write(STDOUT_FILENO, buf, n);
close(sockfd);
return 0;
}
由于客户端不需要固定的端口号,因此不必调用bind()
,客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind()
,只是没有必要调用bind()
固定一个端口号
在客户端程序中用到的新的API是connect()
:
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
connect和bind的参数形式一致,区别在于bind的参数是自己的地址,而connect的参数是对方的地址。 connect()
成功返回0,出错返回-1
网友评论