socket编程03: 一个简单的TCP客户端程序

2018-09-06  本文已影响9人  赵伯舟

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

上一篇下一篇

猜你喜欢

热点阅读