socket();
#include /* see notes */
#include int socket(int domain, int type, int protocol);
應用程式可以像讀寫檔案一樣用read和write在網路上收發資料;
返回-1,代表出錯。
對於ipv4 family指定位af_inet;
對於tcp協議,type引數指定為sock_stream,代表面向位元組流傳輸協議。
在本部落格 udp網路程式設計套接字 中提到過一些介面,這裡分析一下:
#include #include int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
伺服器程式所監聽的網路位址和埠號通常是固定不變的,客戶端程式得知伺服器程式的位址和埠號就可以向伺服器發起連線請求,伺服器需要呼叫bind繫結乙個固定的網路位址和埠號;
bind()成功返回0 ,失敗-1;
struct sockaddr* 是乙個通用的指標型別,myaddr引數實際上可以接受多種協議的sockaddr結構體,而它們的長度卻各不相同,所以第三個引數addrlen指定結構體的長度。
對myaddr的初始化:
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = af_inet;
servaddr.sin_addr.s_addr = htonl(inaddr_any);
servaddr.sin_port = htons(serv_port);
1.將整個結構體清零;
2.設定位址型別為af_inet;
3.網路位址為inaddr_any,這個巨集表示本地的任意ip位址,伺服器可能有多個網絡卡,每個網絡卡可能繫結多個ip位址,這樣設定可以在所有的ip位址上監聽,知道確定與某個客戶端建立了連線時才確定下來到底用哪個ip位址。
#include int listen(int s, int backlog);
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
listen()宣告sockfd處於監聽狀態,並且最多允許有blocklog個客戶端處於連線等待狀態,如果接收到更多的請求就忽略且設定一般為5;
主要是從底層獲取新的連線,成功為0,失敗-1.
三次握手完成後,伺服器呼叫accept()接受連線。
如果伺服器呼叫accept()沒有客戶端的連線請求,就處於阻塞式等待,
addr是乙個傳出引數,accept()返回時傳出客戶端的埠號和位址
addrlen為了避免溢位的問題,傳出是客戶端位址的結構體的實際長度
以下為多程序的網路程式
//伺服器
#include#include#include#include#include#include #include#include#include#define max 128
void service(int sock,char* ip,int port)
else if(s == 0)
else
}}int statup(char* ip,int port)
struct sockaddr_in local;
local.sin_family = af_inet;
local.sin_addr.s_addr = inet_addr(ip);
local.sin_port = htons(port);
if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0)
if(listen(sock,5) < 0)
return sock;
}// ./tcpserver 127.0.0.1 8080
int main(int argc,char* argv)
int listen_sock = statup(argv[1],atoi(argv[2]));
struct sockaddr_in peer;
char ipbuf[24];
for(;;)
inet_ntop(af_inet,(const char*)&peer.sin_addr,ipbuf,sizeof(ipbuf));
int port = ntohs(peer.sin_port);
printf("get a new connet,[%s:%d]\n",ipbuf,port);
pid_t id = fork();
if(id == 0)
service(new_sock,ipbuf,port);
close(new_sock);
return 0;
}else if(id > 0)
else
}return 0;
}
//客戶端
#include#include#include#include#include#include #include#include#define max 128
// ./tcpclient 127.0.0.1 8080
int main(int argc,char* argv)
int sock = socket(af_inet,sock_stream,0);
if(sock < 0)
struct sockaddr_in server;
server.sin_family = af_inet;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0)
char buf[max];
while(1)
write(sock,buf,strlen(buf));
s = read(sock,buf,sizeof(buf)-1);
buf[s] = 0;
printf("server echo %s\n",buf);}}
close(sock);
return 0;
}
linux網路程式設計 tcp套接字
1.標頭檔案 include include include include include 2.接受傳送流程 服務端 include include include include include include int main printf hello,welcome to my server...
TCP套接字程式設計
網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...
TCP套接字程式設計
對於socket不理解的可以檢視 c語言通過socket程式設計實現tcp通訊,linux socket程式設計 socket詳解 先看看程式效果圖 提示如果伺服器,直接通過ctrl z關閉,這樣程式占用的位址不會釋放,需要以下操作 1.ps 檢視程序 2.kill 9 程式pid 強制殺死程序 服...