當前位置:首頁 » 操作系統 » linuxsocket客戶端

linuxsocket客戶端

發布時間: 2024-09-13 19:25:03

1. linux下,socket伺服器和客戶端TCP方式建立了連接,如何使它們之間相互發送消息

1.可能是在獲取客戶端的ip和埠時,處理出現問題,導致無法正確發送到客戶端。
2.客戶端是否使用固定的埠來接收伺服器信息,或伺服器是否正確發送到客戶端的相應的埠。
3.通過上面分析,最大可能是在處理埠出現問題,請重新檢查。
4.實在不行,最好使用拋出異常方法來捕獲錯誤消息,或是通過一步一步調試分析數據發送過程。

2. linux C語言編程,socket實現的即使通訊系統

Socket通信創建步驟:

(1)通過socket()函數創建socket
(2)通過bind函數綁定socket於設備地址
(3)進行讀寫操作read/recv/recvfrom write/send/sendto
(4)close方法關閉套接字


例子如下:

test1.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket ");
exit(-1);
}
printf("socketfd=%d ",fd);

//buildconnectionaddress
structsockaddr_inaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");

intr;
r=bind(fd,(structsockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror("bind");
close(fd);
exit(-1);
}
printf("bindaddresssuccessful! ");
//acceptorsendmessage
charbuf[255];
structsockaddr_infrom;
socklen_tlen;
len=sizeof(from);
while(1)
{
r=recvfrom(fd,buf,sizeof(buf)-1,0,(structsockaddr*)&from,&len);
if(r>0)
{
buf[r]=0;
printf("Themessagefrom%sis:%s ",inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//closesocket
close(fd);
return0;
}

test2.c

java">#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket");
exit(-1);
}
printf("createsocketOK! ");
//createansendaddress
structsockaddr_inaddr={};
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//
intr;
charbuf[255];
while(1)
{
r=read(0,buf,sizeof(buf)-1);
if(r<=0)
break;
sendto(fd,buf,r,0,(structsockaddr*)&addr,sizeof(addr));
}
//closesocket
close(fd);
return0;
}

先運行test1.c,然後運行test2.c,在test2.c運行後輸入內容,在test1.c所在終端中就會顯示信息

運行結果如下:

3. 求linux socket網路編程代碼

Linux是多任務的操作系統,可在運行在Intel 80386及更高檔次的PC機、ARMS、MIPS和PowerPC等多種計算機平台,已成為應用廣泛、可靠性高、功能強大的計算機操作系統,Linux具有內核小、效率高、源代碼開放等優點,還內含了TCP/IP網路協議,很適合在伺服器領域使用,而伺服器主要用途之一就是進行網路通信,隨著計算機辦公自動化處理技術的應用與推廣,網路的不斷普及,傳統的紙張式文件傳輸方式已經不再適合發展的需要,人們更期待一種便捷、高效、環保、安全的網路傳輸方式.

協議概述TCP/IP即傳輸控制協議/網路協議[1](Transmission Control Protocol/Internet Protocol),是一個由多種協議組成的協議族,他定義了計算機通過網路互相通信及協議族各層次之間通信的規范,圖1描述了Linux對IP協議族的實現機制[2]。

Linux支持BSD的套接字和全部的TCP/IP協議,是通過網路協議將其視為一組相連的軟體層來實現的,BSD套接字(BSD Socket)由通用的套接字管理軟體支持,該軟體是INET套接字層,用來管理基於IP的TCP與UDP埠到埠的互聯問題,從協議分層來看,IP是網路層協議,TCP是一個可靠的埠到埠的傳輸層協議,他是利用IP層進行傳接報文的,同時也是面向連接的,通過建立一條虛擬電路在不同的網路間傳輸報文,保證所傳輸報文的無丟失性和無重復性。用戶數據報文協議(User Datagram Protocol,UDP)也是利用IP層傳輸報文,但他是一個非面向連接的傳輸層協議,利用IP層傳輸報文時,當目的方網際協議層收到IP報文後,必須識別出該報文所使用的上層協議(即傳輸層協議),因此,在IP報頭上中,設有一個"協議"域(Protocol)。通過該域的值,即可判明其上層協議類型,傳輸層與網路層在功能說的最大區別是前者提供進程通信能力,而後者則不能,在進程通信的意義上,網路通信的最終地址不僅僅是主機地址,還包括可以描述進程的某種標識符,為此,TCP/UDP提出了協議埠(Protocol Port)的概念,用於標識通信的進程,例如,Web伺服器進程通常使用埠80,在/etc/services文件中有這些注冊了的埠地址。

對於TCP傳輸,傳輸節點間先要建立連接,然後通過該連接傳輸已排好序的報文,以保證傳輸的正確性,IP層中的代碼用於實現網際協議,這些代碼將IP頭增加到傳輸數據中,同時也把收到的IP報文正確的傳送到TCP層或UDP層。TCP是一個面向連接協議,而UDP則是一個非面向連接協議,當一個UDP報文發送出去後,Linux並不知道也不去關心他是否成功地到達了目的的主機,IP層之下,是支持所有Linux網路應用的網路設備層,例如點到點協議(Point to Point Protocol,PPP)和乙太網層。網路設備並非總代表物理設備,其中有一些(例如回送設備)則是純粹的軟體設備,網路設備與標準的Linux設備不同,他們不是通過Mknod命令創建的,必須是底層軟體找到並進行了初始化之後,這些設備才被創建並可用。因此只有當啟動了正確設置的乙太網設備驅動程序的內核後,才會有/dev/eth0文件,ARP協議位於IP層和支持地址解析的協議層之間。

網路通信原理所有的網路通信就其實現技術可以分為兩種,線路交換和包交換,計算機網路一般採用包交換,TCP使用了包交換通信技術,計算機網路中所傳輸的數據,全部都以包(Packet)這個單位來發送,包由"報頭"和"報文"組成,結構如圖2所示,在"報頭"中記載有發送主機地址,接收主機地址及與報文內容相關的信息等,在"報文"中記載有需要發送的數據,網路中的每個主機和路由器中都有一個路由定址表,根據這個路由表,包就可以通過網路傳送到相應的目的主機。

網路通信中的一個非常重要的概念就是套接字(Socket)[3,4],簡單地說,套接字就是網路進程的ID,網路通信歸根到底是進程的通信,在網路中,每個節點有一個網路地址(即IP地址),兩個進程通信時,首先要確定各自所在網路節點的網路地址,但是,網路地址只能確定進程所在的計算機,而一台計算機上可能同時有多個網路進程,還不能確定到底是其中的哪個進程,由此套接字中還要有其他的信息,那就是埠號(Port),在一台計算機中,一個埠一次只能分配給一個進程,即埠號與進程是一一對應的關系,所以,埠號和網路地址就能唯一地確定Internet中的一個網路進程。可以認為:套接字=網路地址+埠號系統調用一個Socket()得到一個套接字描述符,然後就可以通過他進行網路通信了。

套接字有很多種類,最常用的就有兩種;流式套接字和數據報套接字。在Linux中分別稱之為"SOCK_STREAM"和"SOCK_DGRAM)"他們分別使用不同的協議,流式套接字使用TCP協議,數據報套接字使用UDP協議,本文所使用的是流式套接字協議。

網路通信原理在文件傳輸程序設計中的應用網路上的絕大多數通信採用的都是客戶機/伺服器機制(Client/Server),即伺服器提供服務,客戶是這些服務的使用者,伺服器首先創建一個Socket,然後將該Socket與本地地址/埠號綁定(Bind()),成功之後就在相應的Socket上監聽(Listen()) 。當Accept()函數捕捉到一個連接服務(Connect())請求時,接受並生成一個新的Socket,並通過這個新的Socket與客戶端通信,客戶端同樣也要創建一個Socket,將該Socket與本地地址/埠號綁定,還需要指定伺服器端的地址與埠號,隨後向伺服器端發出Connect(),請求被伺服器端接受後,可以通過Socket與伺服器端通信。

TCP是一種面向連接的、可靠的、雙向的通信數據流,說他可靠,是因為他使用3段握手協議傳輸數據,並且在傳輸時採用"重傳肯定確認"機制保證數據的正確發送:接收端收到的數據後要發出一個肯定確認,而發送端必須要能接受到這個肯定信號,否則就要將數據重發。在此原理基礎之上,設計了基於Linux操作系統下TCP/IP編程實現文件傳輸的實例。我們採用客戶機/伺服器模式通信時,通信雙方發送/接收數據的工作流程如圖3所示。

文件傳輸就是基於客戶機/伺服器模型而設計的,客戶機和伺服器之間利用TCP建立連續,因文件傳輸是一個互動式會話系統,客戶機每次執行文件傳輸,都需要與伺服器建立控制連接和數據連接,其中控制連接負責傳輸控制信息、利用控制命令、客戶機可以向伺服器提出無限次的請求,客戶機每次提出的請求,伺服器與客戶機建立一個數據連接,進行實際的數據傳輸,數據傳輸完畢後,對應的數據連接被清除,控制連接依然保持,等待客戶機發出新的傳輸請求,直到客戶機撤銷控制連接,結束會話。

當進行文件傳輸時,首先向伺服器發出連接請求,伺服器驗證身份後,與客戶端建立連接,雙方進入會話狀態,這時只要客戶端向伺服器端發出數據連接請求,建立起數據連接後,雙方就進入數據傳輸狀態,數據傳輸完畢後,數據連接被撤銷,如此循環反復,直到會話結束,從而實現將文件從伺服器端傳輸至客戶機端。

文件傳輸程序設計流程[5,客戶端的TCP應用程序流程(1)先用Socket()創建本地套介面,給伺服器端套介面地址結構賦值。

(2)用Connect()函數使本地套介面向伺服器端套介面發出建立連接請求,經3次握手建立TCP連接。

(3)用Read()函數讀取所要接收的文件名以及存放在內存里的文件內容。

(4)用Open()函數打開客戶端新建立的目標文件,如果沒有建立,該函數會自動生成目標文件,等待存放文件內容。

(5)最後用Write()函數將讀取的文件內容存放在新的目標文件中,以實現伺服器端向客戶端的文件傳輸。

(6)通信結束,用Close()關閉套介面,停止接收文件。

伺服器端的TCP應用程序流程(1)先用Open()函數打開等待傳輸的可讀文件;(2)用Socket()創建套介面,並給套介面地址結構賦值;(3)用Bind()函數綁定套介面;(4)用Listen()函數在該套介面上監聽請求;(5)用Accept()函數接受請求,產生新的套介面及描述字,並與客戶端連接;(6)用Lseek()函數是為了在每次接受客戶機連接時,將用於讀的源文件指針移到文件頭;(7)用Read()函數讀取一定長度的源文件數據;(8)最後用Write()函數將讀取的源文件數據存放在內存中,以便客戶端讀取;(9)傳輸完畢時,用Close()關閉所有進程,結束文件傳輸。

結語Linux操作系統在網路應用方面具有很強的開發潛力,同時Linux也是可靠性、安全性非常高的系統,因此在基於TCP/IP網路通信的研究與開發中,通常選用Linux操作系統作為開發平台

4. linux的socket編程,listen的時候,怎麼實現連接多個客戶端,超過listen函數的上限

listen默認是同時5個鏈接
收到連接後盡快accept,就可以再收5個了
所以你的問題應該在於盡快把連接建立而不是考慮如何接收更多的等待連接

5. linux下socket 網路編程(客戶端向伺服器端發送文件) 求源代碼 大哥大姐幫幫忙 。。謝謝

server:

#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 19999
#define BACKLOG 10

int SendFileToServ(const char *path, const char *FileName, const char *ip)
{
#define PORT 20002
int sockfd;
int recvbytes;
char buf[MAXDATASIZE];
char send_str[MAXDATASIZE];
char filepath[128] = {0};
struct sockaddr_in serv_addr;
FILE *fp;
sprintf(filepath, "%s%s", path, FileName);

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
return 1;
}
bzero(&serv_addr,sizeof(struct sockaddr_in));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
inet_aton(ip, &serv_addr.sin_addr);
int IErrCount = 0;
again:
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
if (5 == IErrCount)
return 1;
IErrCount++;
perror("connect");
sleep(2);
goto again;
}
//if ((fp = fopen(FileName, "rb")) == NULL)
if ((fp = fopen(filepath, "rb")) == NULL)
{
perror("fopen ");
return 1;
}
recvbytes = write(sockfd, FileName, strlen(FileName));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (!memcmp(buf, "sendmsg", 7))
{
while(fgets(send_str, MAXDATASIZE, fp))
{
recvbytes = write(sockfd, send_str, strlen(send_str));
recvbytes = read(sockfd, buf, MAXDATASIZE);
if (recvbytes <= 0)
{
fclose(fp);
close(sockfd);
return 1;
}
if (memcmp(buf, "goon", 4))
{
fclose(fp);
close(sockfd);
return 1;
}
}
recvbytes = write(sockfd, "end", 3);
}
else
{
fclose(fp);
close(sockfd);
return 1;
}
memset(buf, 0, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) <= 0)
{
close(sockfd);
return 2;
}
char *Eptr = "nginx reload error";
//printf("bf[%s]\n", buf);
int ret;
ret = strncmp(buf, Eptr, strlen(Eptr));
//printf("%d\n", ret);
if (!ret)
{
close(sockfd);
return 2;
}

close(sockfd);
return 0;
}

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// 請在循環體中判斷,如果re_conf == 1,請再次載入配置文件。
}
static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/apuserv.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int MyHandleBuff(const char *buf, char *str, char *FileName, char *pth)
{
sscanf(buf, "%s %s %s", pth, FileName, str);
printf("path=%s\nfilename=%s\nip=%s\n", pth, FileName, str);
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"apuserver start....");
while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "apuserv is already running\n");
syslog(LOG_INFO,"apuserv is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}
int nret;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
char str[16] = {0};
char FileName[128] = {0};
char path[128] = {0};
MyHandleBuff(buff, str, FileName, path);
if (recvbytes > 0)
{
nret = SendFileToServ(path, FileName, str);
printf("nret[%d]\n", nret);
if (1 == nret)
write(client_fd, "send file error", 15);
else if(2 == nret)
write(client_fd, "reload nginx error", 18);
else
write(client_fd, "succ", 4);
}
close(client_fd);
}
}
_________________________________________________
client:
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <syslog.h>
#include <sys/time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/wait.h>

#define MAXDATASIZE 1024
#define SERVPORT 20002
#define BACKLOG 10

int mysyslog(const char * msg)
{
FILE *fp;
if ((fp = fopen("/tmp/tmp.log", "a+")) == NULL)
{
return 0;
}
fprintf(fp, "[%s]\n", msg);
fclose(fp);
return 0;
}
static void quit_handler(int signal)
{
kill(0, SIGUSR2);
syslog( LOG_NOTICE, "apuserv quit...");
// do something exit thing ,such as close socket ,close mysql,free list
// .....
//i end
exit(0);
}
static int re_conf = 0;
static void reconf_handler(int signal)
{
re_conf=1;
syslog(LOG_NOTICE,"apuserv reload configure file .");
// ????·???????1nf == 1£???′μ?????

static int isrunning(void)
{
int fd;
int ret;
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = 0;
lock.l_start = 0;
lock.l_len = 0;
const char *lckfile = "/tmp/dstserver.lock";
fd = open(lckfile,O_WRONLY|O_CREAT);
if (fd < 0) {
syslog(LOG_ERR,"can not create lock file: %s\n",lckfile);
return 1;
}
if ((ret = fcntl(fd,F_SETLK,&lock)) < 0) {
ret = fcntl(fd,F_GETLK,&lock);
if (lock.l_type != F_UNLCK) {
close(fd);
return lock.l_pid;
}
else {
fcntl(fd,F_SETLK,&lock);
}
}
return 0;
}

int main(int argc, char **argv)
{
int sockfd,client_fd;
socklen_t sin_size;
struct sockaddr_in my_addr,remote_addr;
char buff[MAXDATASIZE];
int recvbytes;
#if 1
int pid ;
char ch ;
int ret;
int debug = 0;
signal(SIGUSR1, SIG_IGN);
signal(SIGUSR2, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, quit_handler);
syslog(LOG_NOTICE,"dstserver start....");

while ((ch = getopt(argc, argv, "dhV")) != -1) {
switch (ch) {
case 'd':
debug = 1;
break;
case 'V':
printf("Version:%s\n","1.0.0");
return 0;
case 'h':
printf(" -d use daemon mode\n");
printf(" -V show version\n");
return 0;
default:
printf(" -d use daemon mode\n");
printf(" -V show version\n");
}
}
if (debug && daemon(0,0 ) ) {
return -1;
}
if (isrunning()) {
fprintf(stderr, "dstserver is already running\n");
syslog(LOG_INFO,"dstserver is already running\n");
exit(0);
}
while (1) {
pid = fork();
if (pid < 0)
return -1;
if (pid == 0)
break;
while ((ret = waitpid(pid, NULL, 0)) != pid) {
syslog(LOG_NOTICE, "waitpid want %d, but got %d", pid, ret);
if (ret < 0)
syslog(LOG_NOTICE, "waitpid errno:%d", errno);
}
kill(0, SIGUSR2);
sleep(1);
syslog(LOG_NOTICE,"restart apuserver");
}
signal(SIGHUP, reconf_handler);
signal(SIGPIPE, SIG_IGN);
signal(SIGUSR1,SIG_IGN);
signal(SIGUSR2, SIG_DFL);
signal(SIGTERM, SIG_DFL);
#endif
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}

bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen");
exit(1);
}

char filepath[MAXDATASIZE]= {0};
FILE *fp;
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size))==-1)
{
perror("falied accept");
continue;
}
memset(buff, 0, MAXDATASIZE);
recvbytes = read(client_fd, buff, MAXDATASIZE);
sprintf(filepath, "/etc/nginx/url_rule/%s", buff);
if ((fp = fopen(filepath, "wb")) == NULL)
{
perror("fopen");
close(client_fd);
continue;
}
write(client_fd, "sendmsg", 7);
while(read(client_fd, buff, MAXDATASIZE))
{
if (!memcmp(buff, "end", 3))
{
fclose(fp);
break;
}
else
{
fprintf(fp, "%s", buff);
write(client_fd, "goon", 4);
}
}
//system("nginx -s reload");
char *Sptr = "nginx reload succ";
char *Eptr = "nginx reload error";
int ret;
ret = system("nginx -s reload");
printf("ret[%d]\n", ret);
if (ret != 0)
{
write(client_fd, Eptr, strlen(Eptr));
}
else
{
write(client_fd, Sptr, strlen(Sptr));
}
close(client_fd);
}
}

以前寫的:內容忘記了。不是很復雜你可以自己看!

6. Linux 進程間套接字通信(Socket)基礎知識

姓名:羅學元    學號:21181214375    學院:廣州研究院

【嵌牛導讀】Linux進程間套接字通信基礎

【嵌牛鼻子】Linux 進程間套接字及通信介紹

【嵌牛提問】Linux進程間套接字包含哪些內容,如何實現通信

一、套接字(Socket)通信原理

套接字通信允許互聯的位於不同計算機上的進程之間實現通信功能。

二、套接字的屬性

套接字的特性由3個屬性確定,它們分別是:域、類型和協議。

1. 套接字的域

它指定套接字通信中使用的網路介質,最常見的套接字域是AF_INET,它指的是Internet網路。當客戶使用套接字進行跨網路的連接時,它就需要用到伺服器計算機的IP地址和埠來指定一台聯網機器上的某個特定服務,所以在使用socket作為通信的終點,伺服器應用程序必須在開始通信之前綁定一個埠,伺服器在指定的埠等待客戶的連接。

另一個域AF_UNIX表示UNIX文件系統,就是文件輸入/輸出,它的地址就是文件名。

2. 套接字類型

網際網路提供了兩種通信機制:流(stream)和數據報(datagram),因而套接字的類型也就分為流套接字和數據報套接字。我們主要看流套接字。

流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現,同時也是AF_UNIX中常用的套接字類型。

流套接字提供的是一個有序、可靠、雙向位元組流的連接,因此發送的數據可以確保不會丟失、重復或亂序到達,而且它還有一定的出錯後重新發送的機制。

與流套接字相對的是由類型SOCK_DGRAM指定的數據報套接字,它不需要建立連接和維持一個連接,它們在AF_INET中通常是通過UDP/IP實現的。它對可以發送的數據的長度有限制,數據報作為一個單獨的網路消息被傳輸,它可能丟失、復制或錯亂到達,UDP不是一個可靠的協議,但是它的速度比較高,因為它並不需要總是要建立和維持一個連接。

3.套接字協議

只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。通常只需要使用默認值。

三、套接字地址

每個套接字都有其自己的地址格式,對於AF_UNIX域套接字來說,它的地址由結構sockaddr_un來描述,該結構定義在頭文件

struct sockaddr_un{

sa_family_t sun_family;  //AF_UNIX,它是一個短整型

char sum_path[];  //路徑名

};

對於AF_INET域套接字來說,它的地址結構由sockaddr_in來描述,它至少包括以下幾個成員:

struct sockaddr_in{

short int sin_family;  //AN_INET

unsigned short int sin_port;  //埠號

struct in_addr sin_addr;    //IP地址

}

而in_addr被定義為:

struct in_addr{

unsigned long int s_addr;

}

四、基於流套接字的客戶/伺服器的工作流程

使用socket進行進程通信的進程採用的客戶/伺服器系統是如何工作的呢?

1.伺服器端

首先,伺服器應用程序用系統調用socket來創建一個套接字,它是系統分配給該伺服器進程的類似文件描述符的資源,它不能與其他的進程共享。

接下來,伺服器進程會給套接字起個名字,我們使用系統調用bind來給套接字命名。然後伺服器進程就開始等待客戶連接到這個套接字。

然後,系統調用listen來創建一個隊列,並將其用於存放來自客戶的進入連接。

最後,伺服器通過系統調用accept來接受客戶的連接。它會創建一個與原有的命名套接不同的新套接字,這個套接字只用於與這個特定客戶端進行通信,而命名套接字(即原先的套接字)則被保留下來繼續處理來自其他客戶的連接。

2.客戶端

基於socket的客戶端比伺服器端簡單。同樣,客戶應用程序首先調用socket來創建一個未命名的套接字,然後講伺服器的命名套接字作為一個地址來調用connect與伺服器建立連接。

一旦連接建立,我們就可以像使用底層的文件描述符那樣用套接字來實現雙向數據的通信。

7. linux下socket 網路編程(客戶端向伺服器端發送文件) 求源代碼 大哥大姐幫幫忙 ,。。謝謝

不知道是樓下還是樓上,他用的事windows的套接字貌似,不過過程是一樣的,在Linux下面使用的函數名字不同罷了,客戶端向伺服器端發送文件,過程其實很簡單:
1.客戶端向伺服器端發送傳輸文件的請求(可攜帶一些所傳文件的大小之類的基本信息);
2.伺服器端接收請求(根據文件信息看是否能夠接受請求);
3.客戶端發送文件(如果接收到server的yes響應,那麼就傳送);
4.伺服器端接收文件(寫入到指定目錄的文件夾);

你需要先簡單了解過程,在弄清除Linux下面對socket的操作(其實就類似於對文件的操作)。

如果實在自己寫不出可以:email:[email protected]

熱點內容
聯想電腦授權伺服器在哪 發布:2024-11-24 19:56:37 瀏覽:308
steam伺服器為什麼炸了 發布:2024-11-24 19:45:32 瀏覽:569
加密狗在電腦 發布:2024-11-24 19:43:44 瀏覽:65
dhcp編程 發布:2024-11-24 19:41:33 瀏覽:828
如何檢測雲伺服器的性能 發布:2024-11-24 19:40:15 瀏覽:830
linux動態庫靜態編譯 發布:2024-11-24 19:38:24 瀏覽:291
為什麼編譯一直出錯 發布:2024-11-24 19:30:24 瀏覽:234
如何查看qq仙境電腦配置 發布:2024-11-24 19:30:14 瀏覽:625
怎麼用蘋果玩安卓賬號 發布:2024-11-24 19:29:34 瀏覽:157
2022款雅閣哪個配置全景天窗 發布:2024-11-24 19:25:48 瀏覽:841