unix下編寫socket程式的一般步驟(轉)
unix下編寫socket程式的一般步驟(轉)[@more@]在unix下寫socket程式可能是最方便,你只要掌握其一般步驟,就可以松的寫出面向傳輸層的應用。
1、理解幾個常用的socket函式
#include
#include
int socket(int domain,int type,int portocol);
domain指所使用的協議族(family)可以為AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的傳輸型別,可以為SOCK_STERAM(面向連線的TCP),和SOCK_DGRAM(面向無連線的udp)
int bind(int s,const struct sockaddr *address,size_t address_len);
s為socket返回的檔案描述符
address為協議族名稱和其他資訊
具體結構為struct sockaddr_in{
short sin_family;/*協議族
u_short sin_port;/*埠*/
struct in_addr sin_addr;/*地址*/
char sin_zero[8];
};
int listen(int s,int backlog);
backlog為容許的請求數目
int accept(int s,struct sockaddr *address,int *address_len);
這裡的前兩個引數同上
addres_len是要傳遞一個記有結構大小的地址
int connect(int s,struct sockaddr *address,size_t address_len);
這裡的引數意義同bind
2.理解建立程式的一般呼叫過程
要建立一個處理連線的伺服器端程式,首先要呼叫socket函式建立一個socket,返回一個檔案控制程式碼fd,使以後對它的操作就象對普通檔案裝置一樣讀寫。
由於是伺服器端必須對一個斷口進行監聽其他機器的請求,所以接下去呼叫bind函式,傳入剛才的fd,定義好地址和埠,由於是要接受來自任何host的連線所以應講sin_addr賦為INADDR_ANY,port為你所設定的埠。
注意:這裡的地址和埠是網路位元組順序,所以要呼叫htonl,htons完成主機位元組順序
到網路位元組的轉變
接下來就是監聽listen,呼叫accept接受來自客戶端的請求,accpet返回連線後的檔案描述符,你就可以用它進行收發資訊(對應於read, write)這樣的一個過程就是socket->bind->listen->accpet->Read,write
而對於客戶端則是socket->connect->read,write
3.一個完整的程式
#include
#include
#include /*包含有htons等函式的標頭檔案*/
#include
#include
void main()
{
int listenfd,clifd;
long pid;
struct sockaddr_in myaddr,cliaddr;
int ret;
int len;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if (listenfd<0)
{
perror("socket error");
exit(-1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(8888);
ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if (ret<0)
{
perror("bind error");
exit(-1);
}
listen(listenfd,10);
len=sizeof(struct sockaddr);
while(1)
{
clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
/*注意accept的第三個引數也是地址*/
if(clifd==-1)
{
perror("accept error");
continue;
}
printf("connect from %s %d ",inet_ntoa(cliaddr.sin_addr.s_addr),
ntohs(cliaddr.sin_port));
switch(pid=fork())
{
case 0: /*子程式*/
close(listenfd);
;/*子程式進行其他的操作*/
close(clifd);
exit(0);
break;
case -1:
perror("fork error");
break;
default:/*父程式*/
close(clifd);
break;
}
}
}
4.程式說明
該程式的功能是監聽8888埠的連線,對所有的對8888埠的連線顯示出地址和對方的埠號該程式在sco unix下除錯透過,在其他unix和linux平臺請注意inet_ntoa,htons函式所應在的標頭檔案的名稱
同時該程式用到了併發的觀點,因為accept,read,write均為阻塞(block)的函式,一旦程式block將不能處理其他請求,所以用主程式進行listen,由子程式進行負責對客戶端傳輸資料.
你可以在同一臺unix機器用telnet localhost 8888進行觀察程式會輸出connect from 127.0.0.1 xxxx
1、理解幾個常用的socket函式
#include
#include
int socket(int domain,int type,int portocol);
domain指所使用的協議族(family)可以為AF_UNIX和AF_INET,一般只用AF_INET(指Internet)type指所用的傳輸型別,可以為SOCK_STERAM(面向連線的TCP),和SOCK_DGRAM(面向無連線的udp)
int bind(int s,const struct sockaddr *address,size_t address_len);
s為socket返回的檔案描述符
address為協議族名稱和其他資訊
具體結構為struct sockaddr_in{
short sin_family;/*協議族
u_short sin_port;/*埠*/
struct in_addr sin_addr;/*地址*/
char sin_zero[8];
};
int listen(int s,int backlog);
backlog為容許的請求數目
int accept(int s,struct sockaddr *address,int *address_len);
這裡的前兩個引數同上
addres_len是要傳遞一個記有結構大小的地址
int connect(int s,struct sockaddr *address,size_t address_len);
這裡的引數意義同bind
2.理解建立程式的一般呼叫過程
要建立一個處理連線的伺服器端程式,首先要呼叫socket函式建立一個socket,返回一個檔案控制程式碼fd,使以後對它的操作就象對普通檔案裝置一樣讀寫。
由於是伺服器端必須對一個斷口進行監聽其他機器的請求,所以接下去呼叫bind函式,傳入剛才的fd,定義好地址和埠,由於是要接受來自任何host的連線所以應講sin_addr賦為INADDR_ANY,port為你所設定的埠。
注意:這裡的地址和埠是網路位元組順序,所以要呼叫htonl,htons完成主機位元組順序
到網路位元組的轉變
接下來就是監聽listen,呼叫accept接受來自客戶端的請求,accpet返回連線後的檔案描述符,你就可以用它進行收發資訊(對應於read, write)這樣的一個過程就是socket->bind->listen->accpet->Read,write
而對於客戶端則是socket->connect->read,write
3.一個完整的程式
#include
#include
#include /*包含有htons等函式的標頭檔案*/
#include
#include
void main()
{
int listenfd,clifd;
long pid;
struct sockaddr_in myaddr,cliaddr;
int ret;
int len;
listenfd=socket(AF_INET,SOCK_STREAM,0);
if (listenfd<0)
{
perror("socket error");
exit(-1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=htonl(INADDR_ANY);
myaddr.sin_port=htons(8888);
ret=bind(listenfd,(struct sockaddr *)&myaddr,sizeof(myaddr));
if (ret<0)
{
perror("bind error");
exit(-1);
}
listen(listenfd,10);
len=sizeof(struct sockaddr);
while(1)
{
clifd=accept(listenfd,(struct sockaddr*)&cliaddr,&len);
/*注意accept的第三個引數也是地址*/
if(clifd==-1)
{
perror("accept error");
continue;
}
printf("connect from %s %d ",inet_ntoa(cliaddr.sin_addr.s_addr),
ntohs(cliaddr.sin_port));
switch(pid=fork())
{
case 0: /*子程式*/
close(listenfd);
;/*子程式進行其他的操作*/
close(clifd);
exit(0);
break;
case -1:
perror("fork error");
break;
default:/*父程式*/
close(clifd);
break;
}
}
}
4.程式說明
該程式的功能是監聽8888埠的連線,對所有的對8888埠的連線顯示出地址和對方的埠號該程式在sco unix下除錯透過,在其他unix和linux平臺請注意inet_ntoa,htons函式所應在的標頭檔案的名稱
同時該程式用到了併發的觀點,因為accept,read,write均為阻塞(block)的函式,一旦程式block將不能處理其他請求,所以用主程式進行listen,由子程式進行負責對客戶端傳輸資料.
你可以在同一臺unix機器用telnet localhost 8888進行觀察程式會輸出connect from 127.0.0.1 xxxx
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957686/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 編寫socket套接字的步驟
- PHP 編寫基本的 Socket 程式PHP
- Linux系統下編譯Openssl 步驟:Linux編譯
- Spring整合Mybatis的一般步驟(IDEA版)SpringMyBatisIdea
- 玩轉 PHP 網路程式設計全套之 unix 本地域 socket 通訊PHP程式設計
- 學習C#的一般性步驟C#
- 【轉】Ubuntu系統下使用隨身碟的步驟Ubuntu
- 總結一下使用pytorch搭建神經網路的一般步驟PyTorch神經網路
- Linux下編譯安裝Mysql 5.5的簡單步驟Linux編譯MySql
- SQL隱碼攻擊的原理及一般步驟SQL
- 抖音去水印詳細原理步驟及介面編寫
- vs2010編寫的簡單socket聊天
- openwifi編譯步驟記錄WiFi編譯
- git提交程式碼的正確步驟命令 git更新提交程式碼步驟Git
- VC++程式設計環境下的除錯步驟C++程式設計除錯
- PostgreSQL DBA(132) - pgAdmin(unix_socket_directories)SQL
- UNIX Domain Socket實現簡易聊天AI
- Linux下的 sniff-andthen-spoof程式編寫Linux
- ubuntu正確設定網路的的步驟(一般性方法)Ubuntu
- XtraBackup 搭建從庫的一般步驟及 XtraBackup 8.0 的注意事項
- vnc安裝步驟,4個在Linux下vnc的個安裝步驟VNCLinux
- 網路協議之:socket協議詳解之Unix domain Socket協議AI
- LINUX下ORACLE增量備份的步驟LinuxOracle
- 彈出層layer 完整步驟以及在編寫彈出層時遇到的錯誤
- 7 個步驟幫你編寫一份好的資料分析報告 - modernanalystNaN
- github提交程式碼步驟Github
- injectionForXcode程式碼注入步驟XCode
- spring 程式開發步驟Spring
- SSIS中使用事件處理程式的五個步驟(下)UJ事件
- ubuntu 下安裝nginx步驟UbuntuNginx
- linux下安裝docker步驟LinuxDocker
- MAMP 中的 Mysql 和 redis 都是 unix socket 時的配置方法MySqlRedis
- php-fpm配置Unix socket連線死活不行PHP
- vnc安裝步驟,如何在Linux(CentOS 7)下vnc安裝步驟VNCLinuxCentOS
- 構建模板小程式步驟
- 驅動程式開發步驟
- 本文幫你在 Unix 下玩轉 C 語言
- TRMM降水資料下載步驟
- Linux 下安裝 LR Generator 步驟Linux