c語言套接字編程聊天,套接字編程的基本概念

本文目錄一覽:

C語言的套接字的聊天程序不能用,老是連接失敗?急!!!

這個,你先ping一下看能不能通,要是不能通,你就把防火牆全都關了,再試試~~~

如何用C語言編寫一個簡單的聊天室程序

這樣:

#include stdlib.h

#include stdio.h

#include errno.h

#include string.h

#include unistd.h

#include netdb.h

#include sys/socket.h

#include netinet/in.h

#include sys/types.h

#include arpa/inet.h

#include pthread.h

#define MAXLINE 100;

void *threadsend(void *vargp);

void *threadrecv(void *vargp);

int main()

{

int *clientfdp;

clientfdp = (int *)malloc(sizeof(int));

*clientfdp = socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in serveraddr;

struct hostent *hp;

bzero((char *)serveraddr,sizeof(serveraddr));

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(15636);

serveraddr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

if(connect(*clientfdp,(struct sockaddr *)serveraddr,sizeof(serveraddr)) 0){

      printf(“connect error\n”);

      exit(1);

}

pthread_t tid1,tid2;

printf(“connected\n”);

while(1){

pthread_create(tid1,NULL,threadsend,clientfdp);

pthread_create(tid2,NULL,threadrecv,clientfdp);

}

return EXIT_SUCCESS;

}

void *threadsend(void * vargp)

{

//pthread_t tid2;

int connfd = *((int *)vargp);

int idata;

char temp[100];

while(1){

//printf(“me: \n “);

fgets(temp,100,stdin);

send(connfd,temp,100,0);

printf(”          client send OK\n”);

}

printf(“client send\n”);

return NULL;

}

void *threadrecv(void *vargp)

{

char temp[100];

int connfd = *((int *)vargp);

while(1){

int idata = 0;

idata = recv(connfd,temp,100,0);

if(idata 0){

printf(“server :\n%s\n”,temp);

}

}

return NULL;

}

擴展資料:

注意事項

linux下編譯多線程代碼時,shell提示找不到 pthread_create函數,原因是 pthread.h不是linux系統默認載入的庫文件,應該使用類似如下gcc命令進行編譯:

gcc echoserver.c -lpthread -o echoserver

只要注意 -lpthread參數就可以了。

關於用C語言開發一個簡單的區域網聊天軟體

Linux系統都是C寫的 用C當然行得通

就是個socket編程嘛

我們原來做過一個的原理描述 當然 這個是C\S模式的 其實你可以做成 無服務端的

本系統具有區域網聊天功能。採用了C\S模式(即伺服器創建套接字後,轉換為監聽套接字,一直在監聽是否由客戶端的請求。伺服器接收到相應的請求後,進行相應的處理)。採用了TCP/IP(面向連接)協議。運用了SOCKET套接字實現了很方便的訪問TCP/IP協議。多線程的操作。

伺服器的程序(簡述):

創建socket–bind()–listen()–accept()–recv/send()–close();

客戶端的程序(簡述):

創建scoket–發送connect–recv/send()–close();

關於用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語言套接字編程實現通信

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

服務端:

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

coutbufendl;

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

coutrecvbufendl;

char sendbuf[1024] = {0};

while (1)

{

memset(sendbuf,0,sizeof(sendbuf));

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

cinsendbuf;

send(sock,sendbuf,strlen(sendbuf),0);

recv(sock,recvbuf,1024,0);

coutrecvbufendl;

}

}

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

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

相關推薦

  • 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
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論