linux 网络编程

来源:互联网 发布:淘宝宝贝失效 编辑:程序博客网 时间:2024/05/18 02:14
linux网络编程
一、服务器:
1
、调用socket(),创建socket
2.
、配置地址sockaddr/sockaddr_in
3
bind()绑定地址。
4
、调用listen()函数创建一个等待队列,在其中存放未处理的连接请求。
5
、调用accept()函数等待并接收客户端的连接请求。
6
send()recv()发送接收
二、客户端
客户端与服务器大体一样,只是要通过获取服务器信息进行连接
connect()
程序:
/*server.c*/#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>#include <netinet/in.h>#define PORT            4321#define BUFFER_SIZE        1024#define MAX_QUE_CONN_NM    5int main(){    struct sockaddr_in server_sockaddr, client_sockaddr;    int sin_size, recvbytes;    int sockfd, client_fd;    char buf[BUFFER_SIZE];        /*建立socket连接*/    if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)    {        perror("socket");        exit(1);    }    printf("Socket id = %d\n",sockfd);        /*设置sockaddr_in 结构体中相关参数*/    server_sockaddr.sin_family = AF_INET;    server_sockaddr.sin_port = htons(PORT);    server_sockaddr.sin_addr.s_addr = INADDR_ANY;    bzero(&(server_sockaddr.sin_zero), 8);        int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */    //setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));            /*绑定函数bind*/    if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)    {        perror("bind");        exit(1);    }    printf("Bind success!\n");        /*调用listen函数*/    if (listen(sockfd, MAX_QUE_CONN_NM) == -1)    {        perror("listen");        exit(1);    }    printf("Listening....\n");        /*调用accept函数,等待客户端的连接*/    if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)    {        perror("accept");        exit(1);    }        /*调用recv函数接收客户端的请求*/    memset(buf , 0, sizeof(buf));    if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) == -1)    {        perror("recv");        exit(1);    }    printf("Received a message: %s\n", buf);    close(sockfd);    exit(0);}/*client.c*/#include <sys/types.h>#include <sys/socket.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <unistd.h>#include <netdb.h>#include <netinet/in.h>#define PORT    4321#define BUFFER_SIZE 1024int main(int argc, char *argv[]){    int sockfd, sendbytes;    char buf[BUFFER_SIZE];    struct hostent *host;    struct sockaddr_in serv_addr;        if(argc < 3)    {        fprintf(stderr,"USAGE: ./client Hostname(or ip address) Text\n");        exit(1);    }        /*地址解析函数*/    if ((host = gethostbyname(argv[1])) == NULL)    {        perror("gethostbyname");        exit(1);    }        memset(buf, 0, sizeof(buf));    sprintf(buf, "%s", argv[2]);        /*创建socket*/    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)    {        perror("socket");        exit(1);    }        /*设置sockaddr_in 结构体中相关参数*/    serv_addr.sin_family = AF_INET;    serv_addr.sin_port = htons(PORT);    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);    bzero(&(serv_addr.sin_zero), 8);        /*调用connect函数主动发起对服务器端的连接*/    if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)    {        perror("connect");        exit(1);    }        /*发送消息给服务器端*/    if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)    {        perror("send");        exit(1);    }    close(sockfd);    exit(0);}

原创粉丝点击