码迷,mamicode.com
首页 > 其他好文 > 详细

(一)理解网络编程和套接字

时间:2015-03-18 20:13:15      阅读:528      评论:0      收藏:1      [点我收藏+]

标签:

学习《TCP/IP网络编程》 韩 尹圣雨 著 金国哲 译

套接字类似电话

一、服务器端套接字(listening套接字)---接电话套接字

①调用socket函数---安装电话机

   

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
//成功时返回文件描述符,失败时返回-1

②调用bind函数---分配电话号码

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

③调用listen函数---连接电话线

#include <sys/socket.h>
int listen(int sockfd, int backlog);
//成功时返回0,失败时返回-1

④调用accept函数---拿起话筒

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//成功时返回文件描述符,失败时返回-1

第一步:调用socket函数创建套接字

第二步:调用bind函数分配IP和端口号

第三步:调用listen函数转为可接收请求状态

第四步:调用accept函数受理连接请求  

二、客户端套接字---打电话套接字

①调用socket函数创建套接字

②调用connect函数向服务器端发送连接请求

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

windows服务器端程序示例

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <winsock2.h>
 4 
 5 void ErrorHanding(char* message);
 6 
 7 int main(int argc,char* argv[])
 8 {
 9    WSADATA wsaData;
10    SOCKET  hServSock, hClntSock;
11    SOCKADDR_IN servAddr, clntAddr;
12    int szClntAddr;
13    char message[] = "Hello World!";
14    if (argc!=2)
15    {
16        printf("Usage : %s <port> \n",argv[0]);
17        exit(1);
18    }
19    //初始化套接字库
20    if (WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
21    {
22        ErrorHanding("WSAStarup() error!");
23    }
24    //创建套接字
25    hServSock = socket(PF_INET, SOCK_STREAM, 0);
26    if (hServSock == INVALID_SOCKET)
27    {
28         ErrorHanding("socket() error!");
29    }
30 
31    memset(&servAddr, 0, sizeof(servAddr));
32    servAddr.sin_family = AF_INET;
33    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
34    servAddr.sin_port = htons(atoi(argv[1]));
35    //给该套接字分配IP地址和端口号
36    if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
37    {
38        ErrorHanding("bind() error");
39    }
40    //调用listen函数使创建的套接字成为服务器端套接字
41    if(listen(hServSock, 5) == SOCKET_ERROR)
42    {
43        ErrorHanding("listen() error");
44    }
45    //调用accept函数受理客户端的连接请求
46    szClntAddr = sizeof(clntAddr);
47    hClntSock = accept(hServSock,(SOCKADDR*)&clntAddr,&szClntAddr);
48    if (hClntSock == INVALID_SOCKET)
49    {
50        ErrorHanding("accept() error");
51    }
52    //调用send函数向连接的客户端传输数据
53    send(hClntSock, message, sizeof(message), 0);
54    closesocket(hClntSock);
55    closesocket(hServSock);
56    //程序终止前注销创建的套接字库
57    WSACleanup();
58    return 0;
59 }
60 void ErrorHanding(char* message)
61 {
62     fputs(message, stderr);
63     fputc(\n,stderr);
64     exit(1);
65 }

windows客户端程序示例

 1 #include <stdio.h>
 2 #include <cstdlib>
 3 #include <winsock2.h>
 4 
 5 void ErrorHanding(char* message);
 6 
 7 int main(int argc, char* argv[])
 8 {
 9     WSADATA wsaData;
10     SOCKET hSocket;
11     SOCKADDR_IN servAddr;
12 
13     char message[100];
14     int strLen;
15     if (argc != 3)
16     {
17         printf("Usage : %s <IP> <PORT>\n",argv[0]);
18         exit(1);
19     }
20     //初始化Winsock库
21     if (WSAStartup(MAKEWORD(2,2), &wsaData) !=0)
22     {
23         ErrorHanding("WSAStartup() error!");
24     }
25     //创建套接字
26     hSocket = socket(PF_INET,SOCK_STREAM, 0);
27     if (hSocket == INVALID_SOCKET)
28     {
29         ErrorHanding("socket() error");
30     }
31 
32     memset(&servAddr, 0, sizeof(servAddr));
33     servAddr.sin_family = AF_INET;
34     servAddr.sin_addr.s_addr = inet_addr(argv[1]);
35     servAddr.sin_port = htons(atoi(argv[2]));
36     //通过此套接字向服务器端发出连接请求
37     if (connect(hSocket,(SOCKADDR*)&servAddr, sizeof(servAddr))== SOCKET_ERROR)
38     {
39         ErrorHanding("connect() error");
40     }
41     //调用recv函数接收服务器发来的数据
42     strLen = recv(hSocket, message, sizeof(message)-1, 0);
43     if (strLen == -1)
44     {
45         ErrorHanding("recv() ERROR");
46     }
47     printf("Message from server : %s \n",message);
48 
49     closesocket(hSocket);
50     //注销winsock库
51     WSACleanup();
52     return 0;
53     
54 
55 }
56 
57 void ErrorHanding(char* message)
58 {
59     fputs(message, stderr);
60     fputc(\n,stderr);
61     exit(1);
62 }

 

(一)理解网络编程和套接字

标签:

原文地址:http://www.cnblogs.com/yedekuan/p/4348288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!