struct sockaddr ;
sockaddr定義的標頭檔案:sys/socket.h
struct sockaddr_in ;
sockaddr_in解決了sockaddr 的缺陷,實際上相當於把sockaddr 中的sa_data分成了3個部分:
sockaddr_in 定義的標頭檔案:netinet/in.h和arpa/inet.h
二者長度一樣,都是16個位元組,即占用的記憶體大小是一致的,因此可以互相轉化。二者是並列結構,指向sockaddr_in結構的指標也可以指向sockaddr。
在網路程式設計中我們會對sockaddr_in結構體進行操作,使用sockaddr_in來建立所需的資訊,最後使用型別轉化就可以了。也就是說,平時我們用的還是sockaddr_in,只是有些函式要求傳入的引數是sockaddr,所以需要在傳入時進行強制型別轉換。
概括一下:sockaddr_in用於socket定義和賦值;sockaddr用於函式引數。
本例項分為客戶端(client)和服務端(server)兩個部分。
服務端首先建立起socket,並與本地埠進行繫結,然後開始接收從客戶端的連線請求並與該客戶端的連線,接下來就可以接收客戶端傳送的訊息了。
客戶端在建立socket之後呼叫connect函式建立連線。
#include
#include
#include
#include
#include
#include
#include
#include
#define port 4321 //埠號
#define buffer_size 1024
#define max_que_conn_nm 5
int main()
printf("socket id = %d\n",sockfd);
server_sockaddr.sin_family = af_inet;
server_sockaddr.sin_port = htons(port);
server_sockaddr.sin_addr.s_addr = inaddr_any;
memset(server_sockaddr.sin_zero,0,8);
int i = 1;
setsockopt(sockfd,sol_socket,so_reuseaddr,&i,sizeof(i));
//繫結函式bind
if( -1 == bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) )
printf("bind success\n");
//listen函式
if( -1 == listen(sockfd,max_que_conn_nm) )
printf("listening...\n");
//accept函式
if( -1 == accept(sockfd,(struct sockaddr *)&server_sockaddr,&sin_size))
//recv函式
memset(buf,0,sizeof(buf));
if( -1 == recv(client_fd,buf,buffer_size,0))
printf("received a message: %s\n",buf);
close(fd);
exit(0);
}
#include
#include
#include
#include
#include
#include
#include
#include
#define port 4321 //埠號
#define buffer_size 1024
#define max_que_conn_nm 5
int main(int argc, char *argv)
//位址解析函式
if( null == (host = gethostbyname(argv[1])))
memset(buf,0,sizeof(buf));
sprintf(buf,"%s",argv[2]);
//建立socket
if( -1 == (sockfd = socket(af_inet,sock_stream,0)) )
server_sockaddr.sin_family = af_inet;
server_sockaddr.sin_port = htons(port);
server_addr.sin_addr = *( (struct in_addr*)host->h_addr );
memset(server_addr.sin_zero,0,8);
if( -1 == (connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))) )
//傳送訊息給伺服器端
if( -1 == (sendbytes = send(sockfd,buf,strlen(buf),0)) )
close(sockfd);
exit(0);
}
執行時需要先啟動伺服器,再啟動客戶端。
在ubuntu中可以這樣使用:
./server
./client localhost hello在client.c檔案中不要忘記新增netdb.h標頭檔案
netdb.h標頭檔案裡定義了與網路有關的結構、變數型別、巨集、函式等。
/*通過ip位址獲得主機有關的網路資訊*/
struct hostent* gethostbyaddr(const
void *addr, size_t len, int type);
/*通過主機名獲得主機的網路資訊*/
struct hostent* gethostbyname(const
char *name);
因為我們在client.c中用到了gethostbyname函式,所以需要新增這個標頭檔案。 2 1 4非同步Socket程式設計例項
首先我們了解下關於非同步程式設計的一些知識可以參考我在網上收集的一些資料 c 非同步socket程式設計 我實現了基於非同步通訊的socket伺服器和客戶端程式 下面是我的 第一步 首先新建乙個服務端專案ybserverwindowsforms 然後在專案裡新增乙個自定義的類名為stateobjec...
socket程式設計例項(原始碼)
本例項使用面向連線協議的客戶 伺服器模式,其流程如圖2.3所示 圖2.3 面向連線的應用程式流程圖 伺服器方程式 include include define true 1 main server.sin family af inet server.sin port inaddr any if bi...
linux下socket程式設計例項
linux下socket程式設計例項 一 基本socket函式 linux系統是通過提供套接字 socket 來進行網路程式設計的。網路的socket資料傳輸是一種特殊的i o,socket也是一種檔案描述符。socket也有乙個類似於開啟檔案的函式 socket 呼叫socket 該函式返回乙個整...