《socket编程由笑嘻嘻到绝望》(服务器和客户端)

来源:互联网 发布:软件可靠性方法 pdf 编辑:程序博客网 时间:2024/05/20 11:47


不管是无连接的或者是面相连接,两者服务端和客户端的模型是大致都是下面的几种模型。

面相连接服务端:

  • socket()
  • bind()
  • listen()
  • accept()
  • write()/read()/send()/recv()
  • close()

面相连接客户端:

  • socket()
  • connect()
  • 读写操作如上
  • close()

无连接服务器端

  • socket()
  • bind()
  • sendto()/recvfrom()/write()/read()
  • close()

无连接客户端

  • socket()
  • sendto()/recvfrom()/write()/read()
  • close()

socket编程demo,这些都是简单的C/S模型,编程简单的模型在网上都可以找到就不一一赘述了。

第一个面相连接的tcp的服务器

这里的服务端的代码很简单,只是给连接的服务端一句话,按实际场景进行扩展就可以了。

这里一个小技巧,测试服务端写的成功与否,可以借助telnet验证,方式为telnet + ip + 端口 比如下面的服务端验证以后的打印如下

Trying 127.0.0.1...Connected to 127.0.0.1.Escape character is '^]'.i am baiyusend errConnection closed by foreign host.
#include <stdio.h>       /*printf()*/#include <sys/types.h>          #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>  /* htons() */#include <strings.h>   /*bzero() */#define MY_PORT 6666    //>1024   <65535#define MY_IP "127.0.0.1"#define MY_SEND "i am baiyu\n"int main(){    int socketfd = 0;    int connfd = 0;    struct sockaddr_in my_sock_addr; //这里没必要要用指针去堆空间申请内存    struct sockaddr_in client_sock_addr;     socketfd = socket(AF_INET,SOCK_STREAM,0);    if(-1 == socketfd){        printf("socketfd error!\n");        return -1;    }    my_sock_addr.sin_family = AF_INET;    #if 0    //这种方式是固定ip的    my_sock_addr.sin_port = htons(MY_PORT);    my_sock_addr.sin_addr.s_addr = inet_addr(MY_IP);    #endif    #if 1    my_sock_addr.sin_port = htons(MY_PORT);      my_sock_addr.sin_addr.s_addr = htons(INADDR_ANY);     #endif     //这里注意清零的位置是这八位,千万不可以清错了    bzero(&(my_sock_addr.sin_zero), 8);    if(-1 == bind(socketfd,(struct sockaddr*)&my_sock_addr,sizeof(struct sockaddr))){        printf("bind error!\n");        return -1;    }    if(-1 == listen(socketfd, 10) ){        printf("listen error!");        return -1;    }     while(1){            //这里length的类型要注意是socklen_t            socklen_t length = sizeof(struct sockaddr_in);            if( (connfd = accept(socketfd, (struct sockaddr*)&client_sock_addr, &length)) == -1){            printf("accept error!");            continue;        }        if (send(connfd, MY_SEND, 20, 0) == -1)        {            printf("send error!");            close(connfd);            return -1;        }            close(connfd);    }    close(socketfd);    return 0;}
第二个面相连接的tcp的客户端

在这里的客户端只是简单的接收了服务器的信息就退出,涉及详细功能再添加就可以了。

操作:首先打开服务端,然后运行客户端,打印出来自服务器的信息

./server./client 127.0.0.1打印信息:i am baiyu
#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <netdb.h>  #include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#define PORT 6666  //>1024   <65535#define MAXDATASIZE 32int main(int argc, char *argv[]){    int sockfd = 0;    int numsize = 0;    char buf[MAXDATASIZE];    struct hostent *input_ip;    struct sockaddr_in client_addr;    if (argc != 2)    {        printf("usage: client error\n");            exit(1);    }    if ((input_ip=gethostbyname(argv[1])) == NULL)    {        printf("gethostbyname error\n");        exit(1);    }    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {        printf("socket error\n");        exit(1);    }    client_addr.sin_family = AF_INET;    client_addr.sin_port = htons(PORT);    client_addr.sin_addr = *((struct in_addr *)input_ip->h_addr);    bzero(&(client_addr.sin_zero), 8);    if(connect(sockfd, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1)    {        printf("connect error\n");        exit(1);    }    if((numsize=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)    {        printf("recv error\n");        exit(1);    }    printf("%s\n",buf);    fflush(stdout);    close(sockfd);    return 0;}
第三个无连接的udp的服务器
#include <stdio.h>   #include <string.h>          #include <sys/types.h>          #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>  #include <strings.h>  #define SERVER_PORT  6666#define MAXDATASIZE  32int main(int ac, char *av[]){    int sock_server =  0;    struct sockaddr_in server_addr;    struct sockaddr_in client_addr;       int recvsize = 0;    char recvbuf[256];    sock_server = socket(AF_INET, SOCK_DGRAM, 0);      if(sock_server == -1){        printf("sock_server error!\n");        return -1;    }    server_addr.sin_family = AF_INET;        server_addr.sin_port = htons(SERVER_PORT);       server_addr.sin_addr.s_addr = htons(INADDR_ANY);     socklen_t addrlen = sizeof(struct sockaddr);     if(bind(sock_server, (struct sockaddr*)&server_addr, addrlen) == -1){        printf("bind error!\n");        return -1;    }    while(1){           if(recvsize = recvfrom(sock_server, recvbuf, 256, 0, (struct sockaddr*)&client_addr, &addrlen)>= 0){            printf("recvsize:%d\n%s\n",recvsize, recvbuf);            break;        }    }    close(sock_server);       return 0;}
第四个无连接udp的客户端
#include <stdio.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define SERVER_PORT  6666#define SERVER_IP   "127.0.0.1"#define MAXDATASIZE 256int main(int ac, char *av[]){    char recvbuf[256];    int recvsize = 0;    struct sockaddr_in server_addr;        char buf[MAXDATASIZE] = "I am baiyuer";    int client_sock = socket(AF_INET, SOCK_DGRAM, 0);        if(client_sock == -1){        perror("socket");    }    server_addr.sin_family = AF_INET;       server_addr.sin_port = htons(SERVER_PORT);       server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);      socklen_t addrlen = sizeof(struct sockaddr);       while(1){          if(sendto(client_sock, buf, strlen(buf) + 1, 0, (struct sockaddr*)&server_addr, addrlen) == -1){            continue;        }        }    close(client_sock);      return 0;}
阅读全文
1 0