1. 程式人生 > >Linux下C語言的socket網絡編程

Linux下C語言的socket網絡編程

網絡編程 服務器 enter 編程 scanf 路由 client p s drl

Server.c

  1 #include <sys/types.h>
  2 #include <sys/socket.h>
  3 #include <netinet/in.h>
  4 #include <arpa/inet.h>
  5 #include <netdb.h>
  6 #include <stdio.h>
  7 #include <errno.h>
  8 #include <stdlib.h>
  9 #include <string.h>
 10 #include <unistd.h>
 11
/************************************************************************************************************************ 12 1、int socket(int family,int type,int protocol) 13 family: 14 指定使用的協議簇:AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL(UNIX協議) AF_ROUTE(路由套接字) AF_KEY(秘鑰套接字) 15 type: 16 指定使用的套接字的類型:SOCK_STREAM(字節流套接字) SOCK_DGRAM
17 protocol: 18 如果套接字類型不是原始套接字,那麽這個參數就為0 19 2、int bind(int sockfd, struct sockaddr *myaddr, int addrlen) 20 sockfd: 21 socket函數返回的套接字描述符 22 myaddr: 23 是指向本地IP地址的結構體指針 24 myaddrlen: 25 結構長度 26 struct sockaddr{ 27 unsigned short sa_family; //通信協議類型族AF_xx 28 char sa_data[14]; //14字節協議地址,包含該socket的IP地址和端口號
29 }; 30 struct sockaddr_in{ 31 short int sin_family; //通信協議類型族 32 unsigned short int sin_port; //端口號 33 struct in_addr sin_addr; //IP地址 34 unsigned char si_zero[8]; //填充0以保持與sockaddr結構的長度相同 35 }; 36 3、int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen) 37 sockfd: 38 socket函數返回套接字描述符 39 serv_addr: 40 服務器IP地址結構指針 41 addrlen: 42 結構體指針的長度 43 4、int listen(int sockfd, int backlog) 44 sockfd: 45 socket函數綁定bind後套接字描述符 46 backlog: 47 設置可連接客戶端的最大連接個數,當有多個客戶端向服務器請求時,收到此值的影響。默認值20 48 5、int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen) 49 sockfd: 50 socket函數經過listen後套接字描述符 51 cliaddr: 52 客戶端套接字接口地址結構 53 addrlen: 54 客戶端地址結構長度 55 6、int send(int sockfd, const void *msg,int len,int flags) 56 7、int recv(int sockfd, void *buf,int len,unsigned int flags) 57 sockfd: 58 socket函數的套接字描述符 59 msg: 60 發送數據的指針 61 buf: 62 存放接收數據的緩沖區 63 len: 64 數據的長度,把flags設置為0 65 *************************************************************************************************************************/ 66 int main(int argc, char *argv[]) 67 { 68 int fd, new_fd, struct_len, numbytes,i; 69 struct sockaddr_in server_addr; 70 struct sockaddr_in client_addr; 71 char buff[BUFSIZ]; 72 73 server_addr.sin_family = AF_INET; 74 server_addr.sin_port = htons(8000); 75 server_addr.sin_addr.s_addr = INADDR_ANY; 76 bzero(&(server_addr.sin_zero), 8); 77 struct_len = sizeof(struct sockaddr_in); 78 79 fd = socket(AF_INET, SOCK_STREAM, 0); 80 while(bind(fd, (struct sockaddr *)&server_addr, struct_len) == -1); 81 printf("Bind Success!\n"); 82 while(listen(fd, 10) == -1); 83 printf("Listening....\n"); 84 printf("Ready for Accept,Waitting...\n"); 85 new_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len); 86 printf("Get the Client."); 87 numbytes = send(new_fd,"Welcome to my server\n",21,0); 88 while((numbytes = recv(new_fd, buff, BUFSIZ, 0)) > 0) 89 { 90 buff[numbytes] = \0; 91 printf("%s\n",buff); 92 if(send(new_fd,buff,numbytes,0)<0) 93 { 94 perror("write"); 95 return 1; 96 } 97 } 98 close(new_fd); 99 close(fd); 100 return 0; 101 }

Client.c

#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>
#include <arpa/inet.h>

int main(int argc,char *argv[])
{
    int sockfd,numbytes;
    char buf[BUFSIZ];
    struct sockaddr_in their_addr;
    printf("break!");
    while((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1);
    printf("We get the sockfd~\n");
    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(8000);
    their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    bzero(&(their_addr.sin_zero), 8);
    
    while(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)) == -1);
    printf("Get the Server~Cheers!\n");
    numbytes = recv(sockfd, buf, BUFSIZ,0);//接收服務器端信息  
    buf[numbytes]=\0;  
    printf("%s",buf);
    while(1)
    {
        printf("Entersome thing:");
        scanf("%s",buf);
        numbytes = send(sockfd, buf, strlen(buf), 0);
            numbytes=recv(sockfd,buf,BUFSIZ,0);  
        buf[numbytes]=\0; 
        printf("received:%s\n",buf);  
    }
    close(sockfd);
    return 0;
}

未完待續~

Linux下C語言的socket網絡編程