當前位置:首頁 » 編程軟體 » c套接字編程

c套接字編程

發布時間: 2022-11-30 10:46:48

c語言套接字編程實現通信

給你兩個簡單示例參考下,先運行服務端,再運行客服端,可以實現兩者之間的通信。

服務端:
#include <WINSOCK2.H>
#include <iostream>
using namespace std;

#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}

SOCKET listenfd = socket(AF_INET,SOCK_STREAM,0);
if (listenfd == INVALID_SOCKET)
{
cout<<"socket failed with err code="<<WSAGetLastError()<<endl;
return;
}

sockaddr_in servaddr;
memset(&servaddr,0,sizeof(sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5555);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
// servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int opt = 1;
int ret = setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(const char*)&opt,sizeof(opt));
if (ret == SOCKET_ERROR)
{
cout<<"setsockopt failed with err code="<<WSAGetLastError()<<endl;
return;
}
ret = bind(listenfd,(sockaddr*)&servaddr,sizeof(servaddr));
if (ret == SOCKET_ERROR)
{
cout<<"bind failed with err code="<<WSAGetLastError()<<endl;
return;
}

ret = listen(listenfd,10);
if (ret == SOCKET_ERROR)
{
cout<<"listen failed with err code="<<WSAGetLastError()<<endl;
return;
}

sockaddr_in peeraddr;
int len = sizeof(sockaddr_in);

// while (1)
// {
SOCKET connSocket = accept(listenfd,(sockaddr*)&peeraddr,&len);
if (connSocket == INVALID_SOCKET)
{
cout<<"accept failed with err code="<<WSAGetLastError()<<endl;
return;
}
// 開辟一個線程

cout<<"peer ip=["<<inet_ntoa(peeraddr.sin_addr)<<"]"<<" port=["<<ntohs(peeraddr.sin_port)<<"]"<<endl;

send(connSocket,"welcome to by",strlen("welcome to by"),0);

char buf[1024];
while (1)
{
memset(buf,0,sizeof(buf));
recv(connSocket,buf,1024,0);
cout<<buf<<endl;
send(connSocket,buf,strlen(buf),0);

}
}
客戶端:
#include <WINSOCK2.H>
#include <iostream>
using namespace std;

#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}

SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
if (sock == INVALID_SOCKET)
{
cout<<"socket failed with err code="<<WSAGetLastError()<<endl;
return;
}

sockaddr_in servaddr;
memset(&servaddr,0,sizeof(sockaddr_in));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5555);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

int ret = connect(sock,(sockaddr*)&servaddr,sizeof(servaddr));
if (ret == SOCKET_ERROR)
{
cout<<"connect failed with err code="<<WSAGetLastError()<<endl;
return;
}

char recvbuf[1024] = {0};
recv(sock,recvbuf,1024,0);
cout<<recvbuf<<endl;

char sendbuf[1024] = {0};
while (1)
{
memset(sendbuf,0,sizeof(sendbuf));
memset(recvbuf,0,sizeof(recvbuf));
cin>>sendbuf;
send(sock,sendbuf,strlen(sendbuf),0);
recv(sock,recvbuf,1024,0);
cout<<recvbuf<<endl;

}
}

⑵ 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫

需要用到的頭文件包含:

#include <winsock2.h>

#include <windows.h>

與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫

Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:

Winsock 1:

Windows CE平台支持。

頭文件:WinSock.h

庫:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;

頭文件:WinSock2.h

庫:ws2_32.lib

mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll

(2)c套接字編程擴展閱讀

winsock庫的載入與卸載:

載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

載入成功,返回值為0。

WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~

LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。

卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。

⑶ c套接字編程 在windows和Linux下使用的方法一樣嗎

基本一樣的,大同小異。

⑷ c語言 多線程套接字編程

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

#define PORT 5000 // The port which is communicate with server
#define BACKLOG 10
#define LENGTH 512 // Buffer length
int main ()
{ int sockfd; // Socket file descriptor
int nsockfd; // New Socket file descriptor
int num;
int sin_size; // to store struct size
char sdbuf[LENGTH]; // Send buffer
struct sockaddr_in addr_local;
struct sockaddr_in addr_remote;
char sendstr[16]= {"123456789 abcde"};

/* Get the Socket file descriptor */
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
printf ("ERROR: Failed to obtain Socket Despcritor.\n");
return (0);
}
else
{
printf ("OK: Obtain Socket Despcritor sucessfully.\n");
}

/* Fill the local socket address struct */
addr_local.sin_family = AF_INET; // Protocol Family
addr_local.sin_port = htons(PORT); // Port number
addr_local.sin_addr.s_addr = INADDR_ANY; // AutoFill local address
bzero(&(addr_local.sin_zero), 8); // Flush the rest of struct

/* Blind a special Port */
if( bind(sockfd, (struct sockaddr*)&addr_local, sizeof(struct sockaddr)) == -1 )
{
printf ("ERROR: Failed to bind Port %d.\n",PORT);
return (0);
}
else
{
printf("OK: Bind the Port %d sucessfully.\n",PORT);
}

/* Listen remote connect/calling */
if(listen(sockfd,BACKLOG) == -1)
{
printf ("ERROR: Failed to listen Port %d.\n", PORT);
return (0);
}
else
{
printf ("OK: Listening the Port %d sucessfully.\n", PORT);
}

while(1)
{
sin_size = sizeof(struct sockaddr_in);

/* Wait a connection, and obtain a new socket file despriptor for single connection */
if ((nsockfd = accept(sockfd, (struct sockaddr *)&addr_remote, &sin_size)) == -1)
{
printf ("ERROR: Obtain new Socket Despcritor error.\n");
continue;
}
else
{
printf ("OK: Server has got connect from %s.\n", inet_ntoa(addr_remote.sin_addr));
}

/* Child process */
if(!fork())
{
printf("You can enter string, and press 'exit' to end the connect.\n");
while(strcmp(sdbuf,"exit") != 0)
{
scanf("%s", sdbuf);
if((num = send(nsockfd, sdbuf, strlen(sdbuf), 0)) == -1)
{
printf("ERROR: Failed to sent string.\n");
close(nsockfd);
exit(1);
}
printf("OK: Sent %d bytes sucessful, please enter again.\n", num);
}
}
close(nsockfd);
while(waitpid(-1, NULL, WNOHANG) > 0);
}
}

⑸ Linux C高手 使用套接字編程 怎麼樣程序一直監聽 使用多線程,不i想在main和線程裡面使用while 太佔cpu

樓主是不是沒有學過操作系統原理。 設計操作系統的人可沒這么傻。
recv這個API是操作系統實現的。當recv調用時,這個線程會進入操作系統的阻塞隊列。就是此時操作系統不再處理這個線程,再是轉去運行其它線程。而當接收消息到來時, 操作系統再把這個線程從阻塞隊列移到Ready隊列,繼續運行。 所以根本不浪費CPU時間。

while(1){
recv();//此時該線程阻塞,只有等到數據來了的時候繼續運行。
處理數據;
}

⑹ c的套接字編程中需要的scoket庫是什麼

在VC中進行WINSOCK的API編程開發的時候,需要在項目中使用下面三個文件,否則會出現編譯錯誤。

1.WINSOCK.H: 這是WINSOCK API的頭文件,需要包含在項目中。

2.WSOCK32.LIB: WINSOCK API連接庫文件。在使用中,一定要把它作為項目的非預設的連接庫包含到項目文件中去。

3.WINSOCK.DLL: WINSOCK的動態連接庫,位於WINDOWS的安裝目錄下。

本文章來自www.21shipin.com 21視頻教程網
基於Visual C++的Winsock API研究_VC技術_C語言教程_C語言程序設計教程 原文鏈接:http://www.21shipin.com/html/95490.shtml

⑺ 關於用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;
}

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

⑻ 如何用c語言編寫socket套接字

如果你要編寫的是一個服務程序,那麼先調用socket()創建一個套接字,然後調用bind()綁定ip地址和埠,再然後啟動一個死循環,循環中調用accept()接受連接,對於每個接受的連接,可以起線程進行處理,在線程中調用send()、recv()發送和接收數據。

如果你要編寫的是一個客戶端程序,那麼就簡單多了,先調用socket()創建一個套接字,然後調用connect()連接伺服器,之後就是調用send()、recv()發送和接收數據了。

熱點內容
同時修改多台伺服器管理地址工具 發布:2025-05-16 09:20:36 瀏覽:421
什麼配置就能玩地平線 發布:2025-05-16 09:13:46 瀏覽:82
python旋轉圖片 發布:2025-05-16 09:13:40 瀏覽:638
少女前線防檢測腳本 發布:2025-05-16 08:59:07 瀏覽:728
編譯器對系統的依賴 發布:2025-05-16 08:37:29 瀏覽:711
javamap數組 發布:2025-05-16 08:37:28 瀏覽:451
移動光貓如何自行修改密碼 發布:2025-05-16 08:20:15 瀏覽:125
作為基線存儲 發布:2025-05-16 08:15:22 瀏覽:859
安卓怎麼關閉手機應用推薦 發布:2025-05-16 08:03:38 瀏覽:930
sql內置函數 發布:2025-05-16 08:03:34 瀏覽:923