導航:首頁 > 源碼編譯 > 伺服器與客戶端通信怎麼編譯

伺服器與客戶端通信怎麼編譯

發布時間:2022-09-25 06:46:17

⑴ 用C語言在WIN32下編譯一個簡單的聊天程序,客戶端向伺服器發消息,伺服器接到消息後會返回一個

#include<stdio.h>#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<netinet/in.h>
#include<sys/socket.h>

#define SERVERPORT 5555#define BACKLOG 10
#define MAXLEN 1024

int main(){
int sockfd,client_fd;
int sin_size = 0;
int recvlen = 0;
char recvbuf[MAXLEN]={0};
struct sockaddr_in my_addr;
struct sockaddr_in cli_addr;
int iRet;

/*建立socke通信*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("Create socket error\n\n");
exit(1);
}

printf("socket success\n");

my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVERPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
memset(my_addr.sin_zero,0,8);

/*綁定socket埠*/
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
printf("bind error\n");
close(sockfd);
exit(1);
}

printf("bind success\n");

/*監聽埠*/
if(listen(sockfd,BACKLOG) == -1){
printf("listen error\n!");
close(sockfd);
exit(1);
}

printf("listren success\n");

while(1) {

sin_size = sizeof(struct sockaddr_in);

/*阻塞等待客戶端發送消息*/
if((client_fd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size)) == -1)
{
printf("accept error !");
continue;
}
printf("accept success\n");
printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr));

/*fork進程,子進程處理接收的信息*/
iRet=fork();
if(iRet < 0)
{
printf(" fork err, pid=[%d]", getpid());
}

/*fork返回0,為子進程*/
else if(iRet == 0)
{

printf("pid=[%d]", getpid());
printf("子進程\n");

memset(recvbuf,0,sizeof(recvbuf));

/*接收客戶端發送的內容*/
if((recvlen = recv(client_fd,recvbuf,MAXLEN,0)) == -1)
{
printf("recv error\n");
close(client_fd);
exit(1);
}
printf("recvlen[%d]\n",recvlen);
printf("recvmsg:\n%s\n",recvbuf);

/*向客戶端發送內容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)
{
printf("send error\n");
close(client_fd);
exit(1);
}
printf("sendmsg:\n%s\n",recvbuf);

close(client_fd);
exit(0);

}

/*父進程,返回子進程pid*/
else
{
printf("pid=[%d]", getpid());
printf("父進程\n");
continue;
}

}

close(sockfd);
exit(0);
}

⑵ 如何在linux系統的伺服器上進行編譯

方法/步驟

⑶ 進程之間的客戶端與服務端是如何實現通訊的

首先,為了便於理解,我們一般把網路分為多個層次,這個層次的概念是很重要的基礎概念,你可以參考閱讀經典的謝希仁老師翻譯的《計算機網路》。 在進程之間的網路通信一般都是在「網路層」即IP層,我們編寫程序一般也都是基於這個層次或者這個層次之上的傳輸層或者應用層。語言(實際上是操作系統和庫函數)提供了封裝好的函數,讓我們可以不用關心鏈路層以及物理層的細節。 下面逐一回答你的問題: 1)初始化網路環境是什麼意思,有什麼作用? 為了建立通信連接,我們需要明確當前的網路環境是怎樣的,因為和單機系統的進程通信不同,網路進程間通信比較復雜,而且操作系統支持的網路協議也會很多,不同協議的工作方式不同,地址格式也不同。為了解決多重協議的識別問題,我們必須引入一些用於區分的概念並對其初始化。 2)套接字的意思和作用是什麼? 套接字提供了對網路連接的一系列封裝——雖然你可以自己寫,但完全沒有必要不是么?它根據指定的地址族、數據類型和協議來分配一個套介面的描述字及其所用的資源。例如TCP/IP的socket提供三種類型套接字(流式、數據報、原始),分別對應面向連接的服務(例如FTP)、無連接服務(例如NFS)和較底層的連接服務(例如IP或者自定義協議),你可以基於套接字提供的封裝比較方便的實現網路連接服務。 在IP層次以上網路通信的基本原理和電話或者電報的基本原理是非常相近的。TCP連接類似電話,UDP連接類似電報。 下面我以一些代碼片段(注意是幫助理解的片段,不能編譯執行)簡單地對其進行類比: fd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(1234); address_len = sizeof(address); //這就是在初始化網路環境,類似於你朋友買了一個電話,同時到電信公司申請了號碼,然後登記的分機是1234 bind(fd, (struct sockaddr *)&address, address_len); //好了,這是做了一個bind(綁定),類似於電信公司把電話號碼和你朋友家的哪個埠線連上了。 listenfd = listen(fd, 64) while(1){ ....一系列等待客戶端的操作,從略 } //這里在伺服器端一般會有一個無限循環,伺服器會一直等待來自客戶端的消息,類似於你朋友一直在等待你的電話。客戶端,類似的也有買電話(socket創建)和初始化,我就不寫了,預先設定好你要撥打的分機號碼是1234 rtval = connect(fd, (struct sockaddr *)&address, address_len); //上面的語句表示開始撥打電話了: //如果你的朋友接了電話,通話建立了(上面語句的返回值rtval不為-1),你就可以講話: writen(fd, (void *)data, strlen(data)); //對方講話,你聽: len = readline(fd, (void *)data2, 100); //講完了,掛電話,類似於下面的語句: close(fd); 整體情況大概就是這樣,所以可以看到計算機的實現和日常生活是很接近的!希望這可以幫助你理解網路通信。 最後建議閱讀TCP/IP詳解之卷2(實現),裡面很多例子不長但很經典,對於打好基礎很有幫助。

⑷ 易語言伺服器端跟客戶端通訊問題

你好,這個不需要映射,如果你是認真想做服務端和客戶端的話,請購買獨立ip的vps主機。淘寶上面有大把的。也就40塊錢一個月。
VPS主機要求如下:
1,vps必須是獨立IP
2,vps必須是windows系統
3,vps推薦購買香港機房的

買好獨立vps後,你會獲得一個獨享的公網IP,再在客戶端連接服務端裡面填寫好IP,再把伺服器放到vps上面打開運行,至此,服務端與客戶端通信成功。

不需要什麼映射埠,徒勞無功

解決問題不容易,回答更不容易,請採納。

⑸ C語言socket編程怎麼實現2個客戶端之間通信

兩個單獨的客戶端是沒法通信的,必須經過伺服器。
伺服器和客戶端連接過程如下:
客戶端:
socket-->connect-->read/write
伺服器:
socket-->bind-->listen-->accept-->write/read
若要通訊必須要有伺服器,只有在connect和accept建立好連接之後才能真正的通信。
如果你是問編程的流程或者上述函數的意義和用法網路上一大堆。

⑹ 客戶端與伺服器端的通訊,C++書寫步驟。

C++通過socket編程實現服務端與客戶端的通訊,代碼如下(個人環境下測試正常,如果遇到運行send發送報錯,請檢查伺服器埠是否被佔用,調試的時候請先運行服務端程序在運行客服端,一定要載入庫函數ws2_32.lib,發送字元時應該多加一個空字元作為結束字元):

伺服器端程序:

//Server.cpp:.
#include"winsock2.h"
#pragmacomment(lib,"ws2_32.lib")
#include<iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA變數
SOCKETsServer;//伺服器套接字
SOCKETsClient;//客戶端套接字
SOCKADDR_INaddrServ;;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charsendBuf[BUF_SIZE];//返回給客戶端得數據
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return1;
}

//創建套接字
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源;
return-1;
}

//伺服器套接字地址
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons(4999);
addrServ.sin_addr.s_addr=INADDR_ANY;
//綁定套接字
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
cout<<"bindfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}

//開始監聽
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
cout<<"listenfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}

//接受客戶端請求
sockaddr_inaddrClient;
intaddrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
cout<<"acceptfailed!"<<endl;
closesocket(sServer);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}

while(true)
{
//接收客戶端數據
ZeroMemory(buf,BUF_SIZE);
retVal=recv(sClient,buf,BUF_SIZE,0);
if(SOCKET_ERROR==retVal)
{
cout<<"recvfailed!"<<endl;
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;
return-1;
}
if(buf[0]=='0')
break;
cout<<"客戶端發送的數據:"<<buf<<endl;

cout<<"向客戶端發送數據:";
cin>>sendBuf;

send(sClient,sendBuf,strlen(sendBuf),0);
}

//退出
closesocket(sServer);//關閉套接字
closesocket(sClient);//關閉套接字
WSACleanup();//釋放套接字資源;

return0;
}

客戶端程序:

#include"winsock2.h"
#include<iostream>
#pragmacomment(lib,"ws2_32.lib")

usingnamespacestd;
BOOLRecvLine(SOCKETs,char*buf);//讀取一行數據

intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;

WSADATAwsd;//WSADATA變數
SOCKETsHost;//伺服器套接字
SOCKADDR_INservAddr;//伺服器地址
charbuf[BUF_SIZE];//接收數據緩沖區
charbufRecv[BUF_SIZE];
intretVal;//返回值
//初始化套結字動態庫
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return-1;
}
//創建套接字
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//釋放套接字資源
return-1;
}

//設置伺服器地址和埠
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servAddr.sin_port=htons((short)4999);
intnServAddlen=sizeof(servAddr);

//連接伺服器
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal)
{
cout<<"connectfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
while(true)
{
//向伺服器發送數據
ZeroMemory(buf,BUF_SIZE);
cout<<"向伺服器發送數據:";
cin>>buf;
retVal=send(sHost,buf,strlen(buf),0);
if(SOCKET_ERROR==retVal)
{
cout<<"sendfailed!"<<endl;
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return-1;
}
//RecvLine(sHost,bufRecv);
ZeroMemory(bufRecv,BUF_SIZE);
recv(sHost,bufRecv,BUF_SIZE,0);//接收伺服器端的數據,只接收5個字元
cout<<endl<<"從伺服器接收數據:"<<bufRecv;
cout<<" ";
}
//退出
closesocket(sHost);//關閉套接字
WSACleanup();//釋放套接字資源
return0;
}

⑺ 客戶和伺服器通信編程實現

//用fork的,也可用select
/* server process */

/* include the necessary header files */
#include<ctype.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include <arpa/inet.h>
#include<stdio.h>
#include<unistd.h>

#define SIZE sizeof(struct sockaddr_in)

int newsockfd;

int main (int argc, char ** argv) {
int sockfd;
char c;

/* set up the transport end point */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
perror ("socket call failed");
exit (1);
}

/* initialize the internet socket with a port number of 7000
and the local address,specified as INADDR_ANY */
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port = htons(7000);

/* "bind server address to the end point */
if (bind (sockfd, (struct sockaddr *) &server, SIZE) == -1) {
perror ("bind call failed");
exit (1);
}

/* start listening for incoming connections */
if (listen (sockfd, 5) == -1) {
perror ("listen call failed");
exit (1);
}

for (;;) {
/*accept a connection */
if ((newsockfd = accept (sockfd, NULL, NULL)) == -1) {
perror ("accept call failed");
continue;
}

/* spawn a child to deal with the connection */
if (fork () == 0) {
while (recv (newsockfd, &c, 1, 0) > 0) { // could use read
c = toupper (c);
send (newsockfd, &c, 1, 0); // could use write
}
/* when client is no longer sending information
the socket can be closed and the child process
terminated
*/
close (newsockfd);
exit (0);
}
close (newsockfd);
}
}
//客戶端可用telnet

⑻ JSP頁面是如何在客戶端和伺服器端執行的

客戶端在通過瀏覽器訪問伺服器端存放的JSP時,JSP中的java代碼、標簽等是在伺服器端運行的,生成普通的html,最終返回客戶端的是這些html,這樣解釋明白么。

JSP在伺服器端是被編譯成為servlet的,這些servlet負責提供html的輸出,因此說JSP和Servlet一樣屬於伺服器端的技術。但是你從地址欄里輸入的可能有jsp後綴,並不表示它就是客戶端運行的。

⑼ 用C++ socket怎麼實現client與server的多線程通信

一種思想就是在伺服器端使用多線程函數,接收到一個客戶端請求就開辟一個新的線程來實現客戶端與伺服器端之間的通信。

具體做法見下面這個例子(在vs2015下編譯通過):

//伺服器端:
#define_WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
#include<process.h>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;

enum{PORT=8621};

voidthread_fun(void*p)
{
//通信線程函數
chars[1024];
SOCKETsocka=(SOCKET)p;
char*str="helloclient!";

sockaddr_insa={AF_INET};
intn_Len=sizeof(sa);

send(socka,str,strlen(str),0);
//獲取客戶端ip地址
getpeername(socka,(sockaddr*)&sa,&n_Len);
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"登錄:"<<endl;

while(true)//循環接收數據
{
inti=recv(socka,s,sizeof(s),0);
if(i<=0)
{
cout<<GetLastError()<<endl;
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"退出:"<<endl;
break;
}
s[i]=0;
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"說:"<<s<<endl;
}
}

intmain()
{
WSADATAwd;
WSAStartup(0x0202,&wd);//初始化載入ws2_32.lib
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);//初始化套接字
if(sock==INVALID_SOCKET)
{
cout<<GetLastError()<<endl;
return-1;
}

sockaddr_insa={AF_INET,htons(PORT)};
if(bind(sock,(sockaddr*)&sa,sizeof(sa))<0)//綁定埠
{
cout<<GetLastError()<<endl;
return-1;
}

listen(sock,5);//監聽

while(true)
{
SOCKETsocka=accept(sock,0,NULL);//通信套接字
_beginthread(thread_fun,0,(void*)socka);//創建線程
}
return0;
}

//客戶端:
#define_WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;

enum{PORT=8621};

intmain()
{
WSADATAwd;
WSAStartup(0x0202,&wd);//初始化載入ws2_32.lib
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);//初始化套接字
if(sock==INVALID_SOCKET)
{
cout<<GetLastError()<<endl;
return-1;
}

sockaddr_insa={AF_INET,htons(PORT)};//指明地址信息
sa.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
intn_Len=sizeof(sa);

if(SOCKET_ERROR==connect(sock,(sockaddr*)&sa,n_Len))//連接
{
cout<<GetLastError()<<endl;
return-1;
}


chars[1024];

intn=recv(sock,s,sizeof(s),0);//接收數據
if(n>0)
{
s[n]=0;
cout<<s<<endl;
}

while(true)
{
cout<<"請輸入要發送的內容:";
cin>>s;
send(sock,s,strlen(s),0);
}
return0;
}

⑽ web客戶端與伺服器之間的通信的基本過程

(1) 連接 當客戶在瀏覽器上鍵入或單擊一個URL時,客戶程序就在網路上搜索定位正確的伺服器,並與其連接。
(2) 請求 在連接後,客戶程序向伺服器發出一個請求,要求伺服器向自己發送指定的信息。
(3) 響應 伺服器收到請求,就向客戶端傳回所需要的文件。
(4)關閉 伺服器發出數據後,就斷開與客戶端的連接,以便接受其他客戶的連接。

閱讀全文

與伺服器與客戶端通信怎麼編譯相關的資料

熱點內容
安卓手機的游戲怎麼打開 瀏覽:198
pdf掃描轉文字 瀏覽:530
微機室裡面的雲伺服器 瀏覽:106
excel能編程嗎 瀏覽:929
android系統框架的介紹 瀏覽:945
無盤系統伺服器如何配置 瀏覽:836
背負貸款如何緩解壓力 瀏覽:82
linux獲取日期時間 瀏覽:881
搬磚問題最合適的演算法 瀏覽:446
小米安卓機密碼忘記了如何解鎖 瀏覽:910
產電plc編程手冊 瀏覽:761
vscodephp 瀏覽:535
阿里雲linux桌面 瀏覽:754
php二維數組搜索 瀏覽:116
ps快捷命令工具箱 瀏覽:253
c4d教程pdf 瀏覽:462
linux集群安裝配置 瀏覽:154
stc單片機介紹 瀏覽:902
如何解壓失戀的人 瀏覽:493
安卓微信滯後怎麼辦 瀏覽:942