網路套接字
套接字使得客戶端和服務端的程式通訊要麼是面向連線的,要麼是面向無連線的。如果一臺計算機上的客戶端套接字使用某個地址訪問在另一臺計算機上的服務套接字,那麼在指定的套接字進行應答後,這兩臺計算機之間就可以進行資料交換了。
套接字:
每個TCP及UDP的協議頭都包含了源埠和目的埠,埠值指明瞭兩個互相獨立的TCP單元使用者。
埠號和IP地址合起來唯一的表示了Internet上的唯一的主機上的應用程式的套接字的位置。
本機地址是機器的IP地址,程式地址是要繫結的埠號。
資料包套接字使用UDP協議,因為UDP是面向資料包的,流套接字使用TCP協議,TCP協議是面向位元組流的。
UDP套接字:
建立套接字:socket()
繫結套接字:bind()
傳送訊息:sendto() 連線傳送
接收訊息:recefrom() 接收資料
標頭檔案:
udp_server.c
udp_client.c
TCP套接字:
建立套接字:socket()
繫結套接字:bind()
監聽套接字:listen()
接收請求:accept()
連線:connect()
tcp_server.c
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
void serverIO(int sock)
{
char buf[1024];
while(1)
{
ssize_t s = read(sock,buf,sizeof(buf)-1);
if(s>0)
{
buf[s] = 0;
printf("client: %s\n",buf);
write(sock,buf,strlen(buf));
}
else if (s==0)
{
printf("quit\n");
break;
}
else
{
perror("read");
break;
}
}
close(sock);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
printf("Usage %s [ip] [port]\n",argv[0]);
return 1;
}
int sock = socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
printf("sock:%d\n",sock);
struct sockaddr_in server_socket;
server_socket.sin_family = AF_INET;
server_socket.sin_addr.s_addr = inet_addr( argv[1]);
server_socket.sin_port = htons(atoi(argv[2]));
//繫結埠
if(bind(sock,(struct sockaddr*)&server_socket,sizeof(server_socket))<0)
{
perror("bind");
return 3;
}
//由於這是TCP協議,所以是可靠傳輸,那麼這裡需要監聽對方是否已連線
if(listen(sock,5)<0)
{
perror("listen");
return 4;
}
while(1)
{
struct sockaddr_in client_socket;
socklen_t len=sizeof(client_socket);
//作為伺服器,需要先接收再傳送,接收來自客戶端的訊息
int new_sock = accept(sock,(struct sockaddr*)&client_socket,&len);
if(new_sock<0)
{
//printf("accept error\n");
perror("accept");
//return 5;
continue;
}
//char buf_ip[INET_ADDRSTRLEN];
//inet_ntop(AF_INET,&client_socket.sin_addr,buf_ip,sizeof(buf_ip));
printf("get new connect,[ip] :%s [port]: %d\n",inet_ntoa(client_socket.sin_addr)\
,ntohs(client_socket.sin_port));
//chuangjianjincheng
pid_t id = fork();
if(id==0)
{
//child
close(sock);
if(fork()>0)
{
exit(1);
}
serverIO(new_sock);
exit(0);
}
else
{
//father
close(new_sock);//must close
waitpid(id,NULL,0);
}
}
return 0;
}
tcp_client.c
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<errno.h>
#include<stdlib.h>
#include<sys/types.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char* argv[])
{
if(argc!=3)
{
printf("Usage %s [ip] [port]\n",argv[0]);
return 1;
}
int sock = socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
struct sockaddr_in server_socket;
server_socket.sin_family = AF_INET;
server_socket.sin_addr.s_addr = inet_addr( argv[1]);
server_socket.sin_port = htons(atoi(argv[2]));
if(connect(sock,(struct sockaddr*)&server_socket,sizeof(server_socket))<0)
{
perror("connect");
return 3;
}
printf("connect success\n");
while(1)
{
char buf[1024];
printf("client# ");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = '\0';
write(sock,buf,sizeof(buf));
read(sock,buf,sizeof(buf));
printf("server# %s\n",buf);
}
close(sock);
return 0;
}
TCP VS UDP
TCP:面向連線,面向位元組流,可靠傳輸
UDP:面向無連線,面向資料包,不可靠傳輸
netstat:檢視網路狀態的工具
-n:拒絕顯示別名,能顯示數字的全部轉化為數字
-l:僅顯示出有在listen 狀態下的服務狀態
-t:顯示出TCP相關選項
-u:顯示出UDP相關選項
相關文章
- 計算機網路之十一:套接字Socket計算機網路
- 套接字為什麼叫套接字?
- 《UNIX網路程式設計》筆記 - 套接字選項/UDP套接字程式設計筆記UDP
- IPC之套接字
- python UDP套接字通訊PythonUDP
- Python 套接字內建方法Python
- 01啟動(關閉)套接字
- 基本TCP套接字程式設計APITCP程式設計API
- 20.7 OpenSSL 套接字SSL加密傳輸加密
- 編寫socket套接字的步驟
- nginx建立和監聽套接字分析Nginx
- 【網路程式設計】TCPIP-8-套接字的多種選項程式設計TCP
- Unix 套接字程序通訊初探【Go 版本】Go
- 14.1 Socket 套接字程式設計入門程式設計
- Unix 套接字程序通訊初探【Java 版本】Java
- 安全套接字層證書是什麼
- Oracle叢集技術 | OLR與套接字檔案(二)Oracle
- Linux 下的程式間通訊:套接字和訊號Linux
- 《UNIX網路程式設計 卷1:套接字聯網API》第一個例子執行時環境搭建程式設計API
- Linux中什麼是套接字檔案?有什麼作用?Linux
- C++關於DLL中建立套接字的問題(求教)C++
- Oracle 叢集的自啟動,OLR與套接字檔案Oracle
- 自智網路:網路自身的數字化轉型
- 【Socket程式設計】【第一節】【Socket基本原理和套接字】程式設計
- 傳輸層協議、應用層、socket套接字、半連結池協議
- Caused by: java.sql.SQLException: 無法從套接字讀取更多的資料JavaSQLException
- 網路原理-計算機網路詳解-網線傳遞數字訊號的原理計算機網路
- 網際網路週刊:2021數字營銷公司排行
- 【解決】無法連線 MKS:套接字連線嘗試次數太多正在放棄
- 萬字綜述之生成對抗網路(GAN)
- 工業網際網路平臺架構方案,構建工業網際網路企業數字化、網路化、智慧化服務體系架構
- 卷積神經網路CNN實戰:MINST手寫數字識別——網路定義卷積神經網路CNN
- C#利用 HttpWebRequest 類傳送post請求,出現“套接字(協議/網路地址/埠)只允許使用一次”問題C#HTTPWeb協議
- SSL數字證書為網際網路提供加密傳輸通道加密
- CNNIC:網際網路助力數字消費發展藍皮書CNN
- 以工業網際網路構築數字經濟新底座
- Okta:2021年亞洲網路數字信任報告
- 灰豚AI數字人興起,AI數字人直播將成網際網路新寵兒!AI