TCP/IP网络编程系列之一(初级)

概述
    网络编程实际上就是编写程序使两台联网的计算机相互的交换数据。操作系统会提供名为“ 套接字 ”的部件。套接字是网络数据传输的软件设备,即使对网络数据传输原理不太熟悉也无关紧要。我们也能通过套接字完成数据传输,因此网络编程又叫套接字编程。
过程 
    我们可以把套接字理解为我们平时的电话机,我们先看一下套接字的创建过程:
  1. 首先你如果要和别人沟通肯定要安装好电话机才可以,所以对应套接字的是调用socket函数时进行对话。
     #include<sys/socket.h>
     int socket(int domain,int type,int protocol)
   成功时返回文件描述符,失败时返回-1.

     2.  其次调用bind函数分配电话号码进行对话,所以用到bind函数,实际上分配的是ip地址。

 #include <sys/socket.h>
 int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen)
 成功时返回0,失败返回-1
    3. 调用listen函数进行进行连线对话。
 int listen(int sockfd,int backlog)
 成功时返回0,失败时返回-1.
   4.调用accept函数进行对话
int accept(int skckfd,struct sockaddr *addr,socklen_t *addrlen)
成功时返回文件描述符,失败时返回-1.
总结一下
  • 调用socket函数创建套接字,为通话准备条件。
  • 调用bind函数分配ip地址和端口,从而确定地址。
  • 调用listen函数转为可接受请求状态。
  • 调用accept函数受理连接请求。

代码实现(基于LINUX)

   编写服务端代码,服务端是能够受理连接请求的程序,该服务端收到连接请求之后向请求者返回"Hello!"。先不用关注语言细节,先把整个套接字编程的整个过程熟悉一遍。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 void Error_Handling(char *message);
 9 
10 int main(int argc,char *argv[])
11 {
12     int serverSocket;
13     int clientSocket;
14     struct sockaddr_in serverAddr;
15     struct sockaddr_in clientAddr;
16     socklen_t clientSocketAddrSize;
17     char message []="Hello!";
18     if(argc != 2)
19     {
20         printf("Usage:%s <port>\n",argv[0]);
21         exit(1);
22     }
23     serverSocket = socket(PF_INET,SOCK_STREAM,0);
24     if(serverSocket == -1)
25     {
26         Error_Handling("socket() error");
27     }
28     memset(&serverAddr,0,sizeof(serverAddr));
29     serverAddr.sin_family=AF_INET;
30     serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);
31     serverAddr.sin_port=htons(atoi(argv[1]));
32     if(bind(serverSocket,(struct sockaddr*) &serverAddr,sizeof(serverAddr))==-1)
33     {
34         Error_Handling("bind() error");
35 
36     }
37     if(listen(serverSocket,5)==-1)
38     {
39         Error_Handling("listen() error");
40     }
41     clientSocketAddrSize = sizeof(clientAddr);
42     clientSocket = accept(serverSocket,(struct sockaddr*)&clientAddr,&clientSocketAddrSize);
43     if(clientSocket == -1)
44     {
45         Error_Handling("accept() error");
46 
47     }
48     write(clientSocket,message,sizeof(message));
49     close(clientSocket);
50     close(serverSocket);
51     return 0;
52 }
53 
54 void Error_Handling(char *message)
55 {
56     fputs(message,stderr);
57     fputc('\n',stderr);
58     exit(1);
59 }
套接字服务端程序

注解:

  • 第23行:调用socket函数创建套接字。
  • 第32行:调用bind函数分配IP地址和端口号
  • 第37行:调用listen函数套接字转为可接受链接状态。d
  • 第42行:调用accept函数受理请求连接。如果在没有连接请求的情况系调用该函数,则不会返回,知道有链接请求为止。
  • 第48行:write函数用于传输数据。

构建打电话套接字(编写客户端代码)

  服务器端创建的套接字又称为服务器套接字或监听程序套接字。客户端套接字的创建过程比服务器端套接字简单。

  请求连接的函数,因为其调用的是客户端套接字。

  

#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
成功时返回0,失败时返回-1.

客户端套接字程序:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <arpa/inet.h>
 6 #include <sys/socket.h>
 7 
 8 #define MAXSIZE 30
 9 void Error_Handling(char* message);
10 
11 int main(int argc,char* argv[])
12 {
13     int sock;
14     struct  sockaddr_in serverAddr;
15     char message[MAXSIZE];
16     int str_len;
17     if(argc != 3)
18     {
19         printf("Usage : %s <IP> <Port> \n",argv[0]);
20         exit(1);
21     }
22     sock = socket(PF_INET,SOCK_STREAM,0);
23     if(sock == -1)
24     {
25         Error_Handling("sock() error");
26     }
27     memset(&serverAddr,0,sizeof(serverAddr));
28     serverAddr.sin_family=AF_INET;
29     serverAddr.sin_addr.s_addr=inet_addr(argv[1]);
30     serverAddr.sin_port=htons(atoi(argv[2]));
31     if(connect(sock,(struct sockaddr*)&serverAddr,sizeof(serverAddr))==-1)
32     {
33         Error_Handling("connect() error");
34     }
35 
36     str_len = read(sock,message,sizeof(message)-1);
37     if(str_len == -1)
38     {
39         Error_Handling("read error");
40     }
41     printf("Message from server : %s \n",message);
42     close(sock);
43     return 0;
44 }
45 
46 void Error_Handling(char *message)
47 {
48     fputs(message,stderr);
49     fputc('\n',stderr);
50     exit(1);
51 }
客户端套接字程序

linux 平台运行(我的环境时Debian 7)

此时服务端在等待请求,然后先打开一个窗口并运行客户端代码,然后如下图所示

  1.在有些函数里面成功时返回文件描述符,其中文件描述符也叫文件句柄

文件描述符 对象
0 标准输入:Standard Input
1 标准输出:Standard Output 
2 标准错误:Standard Error

要想了解具体代码含义,轻耐心等待下一篇博客(套接字类型和协议设置)!

参考书籍:

    《Unix 网络编程》

    《TCP/IP 网络编程》

 

 

posted @ 2014-11-23 22:21  Mr.Brian  阅读(709)  评论(1编辑  收藏  举报