本文目錄一覽:
- 1、C語言的套接字的聊天程序不能用,老是連接失敗?急!!!
- 2、如何用C語言編寫一個簡單的聊天室程序
- 3、關於用C語言開發一個簡單的區域網聊天軟體
- 4、關於用c語言進行套接字編程
- 5、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