Linux C語言的Socket程式設計例子(TCP和UDP)
套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網路中。同一臺機器上的程序間也可以用套接字通訊。套接字是一種通訊機制,客戶/伺服器系統既可以在本地單機上執行,也可以在網路中執行。套接字與管道的區別:它明確區分客戶與伺服器,可以實現將多個客戶連線到一個伺服器。
套接字的工作過程(伺服器端):首先,伺服器應用程式通過socket系統呼叫建立一個套接字,它是系統分配給該伺服器程序的類似檔案描述符的資源,不能與其他程序共享。其次,伺服器程序使用bind系統呼叫給套接字命名。
套接字的工作過程(客戶端):呼叫socket建立一個未命名套接字,將伺服器的命名套接字作為一個地址來呼叫connect與伺服器建立連線。一旦建立了連線,就可以像使用底層檔案描述符那樣來用套接字進行雙向的資料通訊。
一、Linux Socket
1、TCP協議:
伺服器端:tcp_server.c
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- int main(int argc, char *argv[])
- {
- int server_sockfd;//伺服器端套接字
- int client_sockfd;//客戶端套接字
- int len;
- struct sockaddr_in my_addr;
- struct sockaddr_in remote_addr; //客戶端網路地址結構體
- int sin_size;
- char buf[BUFSIZ]; //資料傳送的緩衝區
- memset(&my_addr,0,sizeof(my_addr)); //資料初始化--清零
- my_addr.sin_family=AF_INET; //設定為IP通訊
- my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連線到所有本地地址上
- my_addr.sin_port=htons(8000); //伺服器埠號
- /*建立伺服器端套接字--IPv4協議,面向連線通訊,TCP協議*/
- if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
- {
- perror("socket");
- return 1;
- }
- /*將套接字繫結到伺服器的網路地址上*/
- if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
- {
- perror("bind");
- return 1;
- }
- /*監聽連線請求--監聽佇列長度為5*/
- listen(server_sockfd,5);
- sin_size=sizeof(struct sockaddr_in);
- /*等待客戶端連線請求到達*/
- if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
- {
- perror("accept");
- return 1;
- }
- printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));
- len=send(client_sockfd,"Welcome to my server\n",21,0);//傳送歡迎資訊
- /*接收客戶端的資料並將其傳送給客戶端--recv返回接收到的位元組數,send返回傳送的位元組數*/
- while((len=recv(client_sockfd,buf,BUFSIZ,0))>0)
- {
- buf[len]='\0';
- printf("%s\n",buf);
- if(send(client_sockfd,buf,len,0)<0)
- {
- perror("write");
- return 1;
- }
- }
- close(client_sockfd);
- close(server_sockfd);
- return 0;
- }
客戶端:tcp_client.c
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- int main(int argc, char *argv[])
- {
- int client_sockfd;
- int len;
- struct sockaddr_in remote_addr; //伺服器端網路地址結構體
- char buf[BUFSIZ]; //資料傳送的緩衝區
- memset(&remote_addr,0,sizeof(remote_addr)); //資料初始化--清零
- remote_addr.sin_family=AF_INET; //設定為IP通訊
- remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//伺服器IP地址
- remote_addr.sin_port=htons(8000); //伺服器埠號
- /*建立客戶端套接字--IPv4協議,面向連線通訊,TCP協議*/
- if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
- {
- perror("socket");
- return 1;
- }
- /*將套接字繫結到伺服器的網路地址上*/
- if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
- {
- perror("connect");
- return 1;
- }
- printf("connected to server\n");
- len=recv(client_sockfd,buf,BUFSIZ,0);//接收伺服器端資訊
- buf[len]='\0';
- printf("%s",buf); //列印伺服器端資訊
- /*迴圈的傳送接收資訊並列印接收資訊--recv返回接收到的位元組數,send返回傳送的位元組數*/
- while(1)
- {
- printf("Enter string to send:");
- scanf("%s",buf);
- if(!strcmp(buf,"quit"))
- break;
- len=send(client_sockfd,buf,strlen(buf),0);
- len=recv(client_sockfd,buf,BUFSIZ,0);
- buf[len]='\0';
- printf("received:%s\n",buf);
- }
- close(client_sockfd);//關閉套接字
- return 0;
- }
2、UDP協議:
伺服器端:udp_server.c
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- int main(int argc,
相關推薦
Linux C語言的Socket程式設計例子(TCP和UDP)
套接字是一種程序間的通訊的方法,不同於以往介紹的程序間通訊方法的是,它並不侷限於同一臺計算機的資源,例如檔案系統空間,共享記憶體或者訊息佇列。套接字可以認為是對管道概念的擴充套件——一臺機器上的程序可以使用套接字與另一臺機器上的程序通訊。因此客戶與伺服器可以分散在網
Windows下C語言的Socket程式設計例子(TCP和UDP)
1 #include "stdafx.h" 2 #include <stdio.h> 3 #include <winsock2.h> 4 5 #pragma comment(lib,"ws2_32.lib") 6 7 int main(int argc, char
從 0 開始學習 Linux 系列之「27.Socket 程式設計基礎(TCP,UDP)」
Socket 介面簡介 Socket 套接字是由 BSD(加州大學伯克利分校軟體研發中心)開發的一套獨立於具體協議的網路程式設計介面,應用程式可以用這個介面進行網路通訊。要注意:Socket 不是一套通訊協議(HTTP,FTP 等是通訊協議),而是程式設計的介
網絡編程-socket(三)(TCP和UDP)
int ack tro 127.0.0.1 監聽 input 地址 con print TCP server端 import socketsk = socket.socket() # 創建了一個socket對象sk.bind((‘192.168.21.36‘,8
RTSP流媒體資料傳輸的兩種方式(TCP和UDP)
通常情況下rtsp協議中資料傳輸的實現是UDP,因工作需要,想讓rtsp的資料傳輸部分用TCP實現。DarwinStreamingServer伺服器能自適應客戶端發起的資料傳輸請求是用TCP方式,還是用UDP方式,這裡唯一需要解決的是客戶端協議的發起問題,而vlc支援RTS
Linux下的socket程式設計實踐(四)TCP服務端優化和常見函式
併發下的殭屍程序處理 只有一個程序連線的時候,我們可以使用以下兩種方法處理殭屍程序: 1)通過忽略SIGCHLD訊號,避免殭屍程序 在server端程式碼中新增 signal(
Windows C語言 Socket程式設計 server端(伺服器)--初級(多客戶端——初級版)
看過我的簡單版的伺服器程式碼的,會發現那段程式碼同一時間只能和一個客戶端通訊。這樣的程式碼能力很小侷限性很大。今天我來介紹一種多客戶端的伺服器程式碼。當然這段程式碼還是有問題的,至於是什麼問題我會在程式碼後面說清楚。 我的這個多客戶端的程式碼核心思想是多執行緒
[C語言] Socket程式設計簡單例子/Client+Server
一、原理=====1.基於TCP協議的伺服器端程式流程:=======1)建立套接字(socket)2)繫結套接字(bind)3)將套接字設為監聽,準備接收客戶請求(listen)4)等待客戶請求的到來,當請求到來後,接受請求,返回一個對應於此次連線的套接字(accept)5)用返回的套接字與客戶端進行通訊(
Windows C語言 Socket程式設計 client端(客戶端)--斷線重連版
瞭解了最基礎的C語言客戶端的編寫流程,稍稍加以改動即可實現斷線重連。 當伺服器掉線時,客戶端會以固定的頻率不停的重連。 #include <stdio.h> #include <winsock2.h> #pragma comme
Linux下的socket程式設計實踐(四)TCP的粘包問題和常用解決方案
TCP粘包問題的產生 由於TCP協議是基於位元組流並且無邊界的傳輸協議, 因此很有可能產生粘包問題。此外,傳送方引起的粘包是由TCP協議本身造成的,TCP為提高傳輸效率,傳送方往往要收集到足夠多的資料
(排序演算法)linux c語言實現快速排序(氣泡排序的改進版)
快速排序演算法是對氣泡排序演算法的一種改進,氣泡排序是對單個元素的升降,快速排序是對所有元素的升降,不過這個升降是取了某一個標準的前提下,在本文程式碼中,就以a[i],其實就是以最左邊的元素為參考,比較交換之後,將這個參考元素放到分界的地方,即i的位置。 程式碼如下,裡面有比較詳細的
python3 下的Socket程式設計(TCP&UDP )
網路程式設計中最重要的兩個協議:TCP協議和UDP協議 TCP協議是網際網路中使用最廣泛的傳輸協議,這得益於其穩定,可靠的優勢。TCP協議是面向連線的傳輸協議,通訊雙方(通常是兩個主機上面的兩個程式)需要先建立連線,才能傳輸資料。資料在傳輸過程中會被分成多個小的資料包,這些資料包都會被新
C語言socket程式設計總結(二) inet_pton,/inet_ntop
+ (NSString *)getSockAddrIPString:(conststructsockaddr *)sa{ switch(sa->sa_family) { case AF_INET: { char ipv4_st
C語言基礎程式設計題目(函式題)
6-1 簡單輸出整數 (10 分) 本題要求實現一個函式,對給定的正整數N,列印從1到N的全部正整數。 函式介面定義: void PrintN ( int N ); 其中N是使用者傳入的引數。該函式必須將從1到N的全部正整數順序打印出來,每個數字佔1行。 裁判
C語言socket程式設計---udp通訊及廣播
上篇實現了TCP通訊的例子。由於專案中需要一個伺服器向多臺客戶端傳送訊息。 通過udp這種無連線的通訊,將client.c增加一句 /* 設定通訊方式對廣播,即本程式傳送的一個訊息,網路上所有主機均可以收到 */ yes = 1; setsockopt(fd
Linux下的socket程式設計實踐(八) Select的限制和poll(併發的初步知識)
select的限制 用select實現的併發伺服器,能達到的併發數一般受兩方面限制: 1)一個程序能開啟的最大檔案描述符限制。這可以通過調整核心引數來改變。可以通過ulimit -n(number)來調整或者使用setrlimit函式設定(需要root許可權),但一個系
Linux下的socket程式設計實踐(六)Unix域協議和socketpair傳遞檔案描述符
UNIX域協議並不是一個實際的協議族,而是在單個主機上執行客戶/伺服器通訊的一種方法,所用API與在不同主機上執行客戶/伺服器通訊所使用的API相同。UNIX域協議可以視為IPC方法之一,Unix域協
socket程式設計(TCP、UDP)
Linux下的Socket程式設計大體上包括Tcp Socket、Udp Socket即Raw Socket這三種,其中TCP和UDP方式的Socket程式設計用於編寫應用層的socket程式,是我們用得比較多的,而Raw Socket則用得相對較少,不在本文介紹範圍之列
Linux下的socket程式設計實踐(五)設定套接字I/O超時的方案
(一)使用alarm 函式設定超時 #include <unistd.h> unsigned int
1014 C語言程序設計教程(第三版)課後習題6.4
content += 教程 print ons ont c語言程序設計 lld cnblogs 題目描述 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一個數字。 輸入 n 輸出 和 樣例輸入 5 樣例輸出 153 1 #include "stdio.h"