socket程式設計原理(六)

2021-05-25 17:49:04 字數 2504 閱讀 2452

);

closesocket(sock);

exit(0);

}2.5 乙個通用的例項程式

在上一節中,我們介紹了乙個簡單的socket程式例項。從這個例子我們可以看出,使用socket程式設計幾乎有乙個模式,即所有的程式幾乎毫無例外地按相同的順序呼叫相同的函式。因此我們可以設想,設計乙個中間層,它向上提供幾個簡單的函式,程式只要呼叫這幾個函式就可以實現普通情況下的資料傳輸,程式設計者不必太多地關心socket程式設計的細節。

本節我們將介紹乙個通用的網路程式介面,它向上層提供幾個簡單的函式,程式設計者只要使用這幾個函式就可以完成絕大多數情況下的網路資料傳輸。這些函式將socket程式設計和上層隔離開來,它使用面向連線的流式套接字,採用非阻塞的工作機制,程式只要呼叫這些函式查詢網路訊息並作出相應的響應即可。這些函式包括:

l initsocketsstruct:初始化socket結構,獲取服務埠號。客戶程式使用。

l initpassivesock:初始化socket結構,獲取服務埠號,建立主套接字。伺服器程式使用。

l closemainsock:關閉主套接字。伺服器程式使用。

l createconnection:建立連線。客戶程式使用。

l acceptconnection:接收連線。伺服器程式使用。

l closeconnection:關閉連線。

l querysocketsmsg:查詢套接字訊息。

l sendpacket:傳送資料。

l recvpacket:接收資料。

2.5.1 標頭檔案

/* file name: tcpsock.h */

/* 標頭檔案包括socket程式經常用到的系統標頭檔案(本例中給出的是sco unix下的標頭檔案,其它版本的unix的標頭檔案可能略有不同),並定義了我們自己的兩個資料結構及其例項變數,以及我們提供的函式說明。*/

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

#include 

typedef struct socketsmsg socketsmsg;

typedef struct sockets sockets;

sockets mysock; /* 全域性變數 */

socketsmsg sockmsg;

int initsocketsstruct(char * servicename) ;

int initpassivesock(char * servicename) ;

void closemainsock();

int createconnection(struct in_addr *sin_addr);

int acceptconnection(struct in_addr *ipaddr);

int closeconnection(int sockno);

int querysocketsmsg();

int sendpacket(int sockno, void *buf, int len);

int recvpacket(int sockno, void *buf, int size);

2.5.2 函式原始檔

/* file name: tcpsock.c */

/* 本檔案給出九個函式的源**,其中部分地方給出中文注釋 */

#include "tcpsock.h"

int initsocketsstruct(char * servicename) 

/* initialize sockets structure. if succeed then return 1, else return error code (<0) */

/* 此函式用於只需要主動套接字的客戶程式,它用來獲取服務資訊。服務的定義

在/etc/services檔案中 */

bzero((char *)&mysock, sizeof(sockets));

mysock.port = servrec->s_port; /* service port in network byte order */

return(1); 

}int initpassivesock(char * servicename) 

/* initialize passive socket. if succeed then return 1, else return error code (<0) */

/* 此函式用於需要被動套接字的伺服器程式,它除了獲取服務資訊外,還建立

乙個被動套接字。*/

{int mainsock, flag=1;

struct servent *servrec;

struc

socket程式設計原理

if newsock accept mysock.daemonsock,addr,len 1 return 1 accept error.set this socket as a non blocking socket.ioctl newsock,fionbio,flag fd set newsoc...

socket程式設計原理 三

程式在使用套接字前,首先必須擁有乙個套接字,系統呼叫socket 向應用程式提供建立套接字的手段,其呼叫格式如下 socket pascal far socket int af,int type,int protocol 該呼叫要接收三個引數 af type protocol。引數af指定通訊發生的...

Socket程式設計原理 1

兩種套接字 流套接字 sock stream tcp ip協議 資料報套接字 sock dgram udp ip協議 什麼是tcp ip udp?tcp ip transmission control protocol internet protocol 即傳輸控制協議 網間協議,是乙個工業標準的協...