用c語言寫多連接服務端程序,用c語言寫多連接服務端程序的命令

本文目錄一覽:

C語言中,客戶端如何對多個服務器操作的,詳解~!!

connect有個參數是struct sockaddr 所以可以用多個socket連接多個服務端。然後通過不同的socket給不同的服務器發送數據。還有你是不能直接操作服務器的。服務器只是根據你發送過去的特定數據進行響應。

一樣的,弄個線程然後循環一直accept,判斷:當有客戶端鏈接的時候,就保存下來鏈接的這個客戶端的socket,然後開個線程對這個socket發送數據就可以了。因為是循環accept就會有很多客戶端鏈接過來。

如何實現c語言程序的連接

本答案提交時間:2011-6-12 17:17

Java 和其它語言之間進行Socket通信使用Socket和ServerSocket類。

用JAVA編寫server,C語言編寫Client,當然可以實現通信(示例在最後)。

1、Socket和ServerSocket類庫位於java.net包中。ServerSocket用於服務器端,Socket 是建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。對於一個網絡連接來說,套接字是平等的,並沒有差別,不因為在服務器端或在客戶端而產生不同級別。不管是Socket還是ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。

重要的Socket API:

java.net.Socket繼承於java.lang.Object,有八個構造器,其方法並不多,使用頻繁的三個方法:

. Accept方法用於產生”阻塞”,直到接受到一個連接,並且返回一個客戶端的Socket對象實例。”阻塞”是一個術語,它使程序運行暫時”停留”在這個地方,直到一個會話產生,然後程序繼續;通常”阻塞”是由循環產生的。

. getInputStream方法獲得網絡連接輸入,同時返回一個IutputStream對象實例,。

. getOutputStream方法連接的另一端將得到輸入,同時返回一個OutputStream對象實例。

注意:其中getInputStream和getOutputStream方法均會產生一個IOException,它必須被捕獲,因為它們返回的流對象,通常都會被另一個流對象使用。

2.如何開發一個Server-Client模型的程序

開發原理:

服務器,使用ServerSocket監聽指定的端口,端口可以隨意指定(由於1024以下的端口通常屬於保留端口,在一些操作系統中不可以隨意使用,所以建議使用大於1024的端口),等待客戶連接請求,客戶連接後,會話產生;在完成會話後,關閉連接。

客戶端,使用Socket對網絡上某一個服務器的某一個端口發出連接請求,一旦連接成功,打開會話;會話完成後,關閉Socket。客戶端不需要指定打開的端口,通常臨時的、動態的分配一個1024以上的端口。

下面這個程序用JAVA建立了一個服務器,它一直監聽10000端口,等待用戶連接,而用戶端則可以使用C寫的程序來連接該服務器。

本程序在建立連接後給客戶端返回一段信息,然後結束會話。這個程序一次只能接受一個客戶連接。

import java.net.*;

import java.io.*;

public class Server

{

private ServerSocket ss;

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public Server()

{

try

{

ss = new ServerSocket(10000);

while (true)

{

socket = ss.accept();

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(socket.getOutputStream(),true);

String line = in.readLine();

out.println(“you input is :” + line);

out.close();

in.close();

socket.close();

}

ss.close();

}

catch (IOException e)

{}

}

public static void main(String[] args)

{

new Server();

}

}

如何實現一個服務器與多個客戶端連接

TCP協議:

服務器端:tcp_server.c

[cpp] view plaincopyprint?

#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;

}

#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協議:

客戶端:tcp_client.c

[c-sharp] view plaincopyprint?

#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;

}

#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;

}

UDP協議:

服務器端:udp_server.c

[cpp] view plaincopyprint?

#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 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協議,面向無連接通信,UDP協議*/

if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))0)

{

perror(“socket”);

return 1;

}

/*將套接字綁定到服務器的網絡地址上*/

if (bind(server_sockfd,(struct sockaddr *)my_addr,sizeof(struct sockaddr))0)

{

perror(“bind”);

return 1;

}

sin_size=sizeof(struct sockaddr_in);

printf(“waiting for a packet…/n”);

/*接收客戶端的數據並將其發送給客戶端–recvfrom是無連接的*/

if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)remote_addr,sin_size))0)

{

perror(“recvfrom”);

return 1;

}

printf(“received packet from %s:/n”,inet_ntoa(remote_addr.sin_addr));

buf[len]=’/0′;

printf(“contents: %s/n”,buf);

close(server_sockfd);

return 0;

}

#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 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協議,面向無連接通信,UDP協議*/

if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))0)

{

perror(“socket”);

return 1;

}

/*將套接字綁定到服務器的網絡地址上*/

if (bind(server_sockfd,(struct sockaddr *)my_addr,sizeof(struct sockaddr))0)

{

perror(“bind”);

return 1;

}

sin_size=sizeof(struct sockaddr_in);

printf(“waiting for a packet…/n”);

/*接收客戶端的數據並將其發送給客戶端–recvfrom是無連接的*/

if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)remote_addr,sin_size))0)

{

perror(“recvfrom”);

return 1;

}

printf(“received packet from %s:/n”,inet_ntoa(remote_addr.sin_addr));

buf[len]=’/0′;

printf(“contents: %s/n”,buf);

close(server_sockfd);

return 0;

}

誰能用C語言寫個最簡單socket通信服務端和客戶端示例

網絡的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個類似於打開文件的函數調用Socket(),該函數返回一個整型的Socket描述符,隨後的連接建立、數據傳輸等操作都是通過該Socket實現的。

下面用Socket實現一個windows下的c語言socket通信例子,這裡我們客戶端傳遞一個字符串,服務器端進行接收。

【服務器端】

#include “stdafx.h”

#include stdio.h

#include winsock2.h

#include winsock2.h

#define SERVER_PORT 5208 //偵聽端口

void main()

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/247259.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:20
下一篇 2024-12-12 13:20

相關推薦

  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟件。在VB中,有許多不同的方法可以運行程序,包括編譯器、發佈程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29

發表回復

登錄後才能評論