linux c socket 编程

由于最近会研究socket编程,先编写了简单的客户端和服务器端,供以后使用时候不用再去重复造轮。

贴出代码,再进行分析。

client.c

 1 #include <stdio.h>
 2 #include <arpa/inet.h>
 3 #include <stdlib.h>
 4 #include <errno.h>
 5 #include <string.h>
 6 #include <sys/types.h>
 7 #include <netinet/in.h>
 8 #include <sys/socket.h>
 9 #include <sys/wait.h>
10 
11 #define SERVPORT 4567
12 #define MAXDATASIZE 100
13 #define SERVER_IP "127.0.0.1"
14 #define DATA "this is a client"
15 
16 int main(int argc, char* argv[]) {
17     int sockfd, recvbytes;
18     char buf[MAXDATASIZE];
19     struct hostent *host;
20     struct sockaddr_in serv_addr;
21 
22     if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
23         perror("socket error!");
24         exit(1);
25     }
26 
27     bzero(&serv_addr,sizeof(serv_addr));
28     serv_addr.sin_family    = AF_INET;
29     serv_addr.sin_port      = htons(SERVPORT);
30     serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);
31 
32 if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
33         perror("connect error!");
34         exit(1);
35     }
36 
37    write(sockfd,DATA, sizeof(DATA));
38    if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {
39         perror("recv error!");
40         exit(1);
41     }
42 
43     buf[recvbytes] = '\0';
44     printf("Received: %s",buf);
45     close(sockfd);
46     return 0;
47 }

 

server.c

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define SERVPORT 4567
#define BACKLOG 10
#define MAXSIZE 1024

int main() {
    int sockfd,client_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in remote_addr;
    //创建套接字
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
        perror("socket create failed!");
        exit(1);
    }

    //绑定端口地址
    my_addr.sin_family      = AF_INET;
    my_addr.sin_port        = htons(SERVPORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);
    if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {
        perror("bind error!");
        exit(1);
    }

    //监听端口
    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen error");
        exit(1); 
    }

    while (1) {
        int sin_size = sizeof(struct sockaddr_in);    
        if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {
            perror("accept error!");
            continue;
        }
        printf("Received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));

       //子进程段
        if (!fork()) {
            //接受client发送的请示信息
            int rval;
            char buf[MAXSIZE];   
            if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {
                perror("reading stream error!");
                continue;
            }
            printf("%s\n",buf);

            //向client发送信息
            char* msg = "you have linked\n";
            if (send(client_fd, msg, strlen(msg), 0) == -1) perror("send error!");
            close(client_fd);
            exit(0);
        } 
        close(client_fd);
    }
    return 0;
}

1.编译这段程序时候遇到的问题。

(1).inet_ntoa()报错

       

         原因:.64未linux下,inet_ntoa()函数返回的是int,不是char *。

        .解决方法:添加#include <arpa/inet.h>

 

posted @ 2014-03-04 09:29  elroyzhang  阅读(263)  评论(0编辑  收藏  举报