c語言聊天軟體
/*伺服器*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 5555
#define BACKLOG 10
#define MAX(a,b) ((a)>(b)?(a):(b))
void str_echo(int);
void server()
{
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
socklen_t sin_size;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket create error!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind error!");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen error!");
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1)
{
perror("accept error!");
continue;
}
printf("received a connection from %s\n",inet_ntoa(remote_addr.sin_addr));
if(!fork())
{
close(sockfd);
str_echo(client_fd);
exit(0);
}
close(client_fd);
}
}
void str_echo(int sockfd)
{
int maxfd;
char sendbuf[1024]={0};
char recvbuf[1024]={0};
fd_set rfds;
while(1)
{
FD_SET(0,&rfds);
FD_SET(sockfd,&rfds);
maxfd=MAX(0,sockfd)+1;
select(maxfd,&rfds,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&rfds))
{
bzero(recvbuf,1024);
recv(sockfd,recvbuf,1024,0);
printf("C:%s\n",recvbuf);
}
if(FD_ISSET(0,&rfds))
{
read(0,sendbuf,1024);
send(sockfd,sendbuf,strlen(sendbuf),0);
bzero(sendbuf,1024);
}
}
}
int main()
{
server();
return 0;
}
/*客戶端*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 5555
#define MAXSIZE 1024
#define MAX(a,b) ((a)>(b)?(a):(b))
void client(int argc,char **argv)
{
int sockfd,maxfd;
char sendbuf[MAXSIZE]={0};
char recvbuf[MAXSIZE]={0};
// struct hostent *host;
struct sockaddr_in serv_addr;
fd_set rfds;
/* if(argc<2)
{
fprintf(stderr,"Please enter the sserver's name!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("get host by name error!\n");
exit(1);
}
*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket creat error!\n");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
// serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
serv_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1)
{
perror("connection error!\n");
exit(1);
}
FD_ZERO(&rfds);
while(1)
{
FD_SET(0,&rfds);
FD_SET(sockfd,&rfds);
maxfd=MAX(0,sockfd)+1;
select(maxfd,&rfds,NULL,NULL,NULL);
if(FD_ISSET(sockfd,&rfds))
{
bzero(recvbuf,MAXSIZE);
recv(sockfd,recvbuf,MAXSIZE,0);
printf("S:%s\n",recvbuf);
}
if(FD_ISSET(0,&rfds))
{
fgets(sendbuf,MAXSIZE,stdin);
send(sockfd,sendbuf,strlen(sendbuf),0);
bzero(sendbuf,MAXSIZE);
}
}
// close(sockfd);
}
int main(int argc,char **argv)
{
client(argc,argv);
return 0;
}
⑵ C語言做一個簡單的聊天工具界面
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定義用戶名最大長度
#define P 20
//定義密碼最大長度
#define Q 20
//定義用戶最大數量
#define N 100
//定義用戶屬性的結構體
struct user
{
char user_name[P]; //用戶名
char user_code[Q]; //密碼
int friend_num; //好友數量
int user_friend[N]; //好友名單
};
void main()
{
int p = 0; //操作步驟
int n = 0; //用戶數量
int i = 0; //過程操作數
int j = 0; //過程操作數
int log_id; //合格登陸號碼
char log_name[P]; //用戶名臨時存儲
char log_code[Q]; //密碼臨時存儲
user my_user[N]; //定義用戶
while(1)
{
switch(p)
{
case 0: //注冊登陸選擇界面
printf("請選擇功能:\n");
printf("1.登陸\n");
printf("2.注冊\n");
scanf("%d",&i); //過程數i記錄接收數據
if(i ==1 || i == 2)
{
p = i;
}
else
{
printf("輸入錯誤!\n");
p = 0;
}
i = 0; //過程數i清零
break;
case 1: //登陸界面
printf("請輸入用戶名:\n");
scanf("%s", &log_name);
printf("請輸入密碼:\n");
scanf("%s", &log_code);
for(i=0;i<n;i++) //驗證登陸用戶,過程數i作為循環變數
{
if(strcmp(my_user[i].user_name, log_name) == 0) //驗證用戶名
{
if(strcmp(my_user[i].user_code, log_code) == 0) //驗證密碼
{
printf("登陸成功!\n");
log_id = i; //記錄合格登陸號碼
p = 3;
j = 1; //過程數j作為操作步驟變化標識
}
else
{
printf("密碼錯誤!\n");
p = 1;
j = 1;
}
}
}
i = 0; //過程數i清零
j = 0; //過程數j清零
break;
case 2: //注冊界面
printf("請輸入用戶名:\n");
scanf("%s", &log_name);
printf("請輸入密碼:\n");
scanf("%s", &log_code);
strcpy(my_user[n].user_name, log_name); //保存用戶名
strcpy(my_user[n].user_code, log_code); //保存密碼
n++; //記錄注冊用戶數
printf("注冊成功!\n");
p = 0;
break;
case 3: //用戶界面
printf("當前登陸用戶:%s\n", my_user[log_id].user_name);
printf("請選擇其他操作:\n");
printf("1.顯示好友名單\n");
printf("2.增加好友\n");
printf("3.刪除好友\n");
printf("4.好友分組\n");
printf("5.自選功能\n");
printf("6.登出\n");
scanf("%d",&i); //過程數i記錄接收數據
if(i >=1 && i <= 6)
{
p = i+3;
}
else
{
printf("輸入錯誤!\n");
p = 3;
}
i = 0; //過程數i清零
break;
case 4: //顯示好友名單
printf("好友名單:\n");
for(i=0;i<my_user[log_id].friend_num;i++)
{
j = my_user[log_id].user_friend[i]; //過程數j記錄用戶好友號碼
printf("%s\n", my_user[j].user_name);
}
p = 3;
i = 0;
j = 0;
break;
case 5: //增加好友,未實現
p = 3;
break;
case 6: //刪除好友,未實現
p = 3;
break;
case 7: //好友分組,未實現
p = 3;
break;
case 8: //自選功能,未實現
p = 3;
break;
case 9: //登出
for(i=0;i<20;i++)
{
log_name[i] = 0; //清除用戶名臨時存儲
log_code[i] = 0; //清除密碼臨時存儲
}
p = 0; //返回初始頁面
i = 0; //過程數i清零
break;
default:
p = 0;
break;
}
}
}
⑶ 請問有哪些軟體是用c語言編寫開發的(說具體些,謝謝)
現在我們使用的所有的聊天軟體都是用C語言編發開發的,所以正常情況下,QQ聊天都是屬於C語言編寫
⑷ 如何用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 ");
exit(1);
}
pthread_t tid1,tid2;
printf("connected ");
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: ");
fgets(temp,100,stdin);
send(connfd,temp,100,0);
printf(" client send OK ");
}
printf("client send ");
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 : %s ",temp);
}
}
return NULL;
}
(4)c語言聊天軟體擴展閱讀:
注意事項
linux下編譯多線程代碼時,shell提示找不到 pthread_create函數,原因是 pthread.h不是linux系統默認載入的庫文件,應該使用類似如下gcc命令進行編譯:
gcc echoserver.c -lpthread -o echoserver
只要注意 -lpthread參數就可以了。
⑸ c語言 編寫一個智能聊天工具
可以使用智能聊天機器人的介面來做
下面是一個簡單的使用小耗子機器人提供的介面的聊天代碼
#include<stdio.h>
#include<string.h>
#include<curl/curl.h>
#include<stdlib.h>
#defineBOT_SER"https://brisk.eu.org/smbot/sm.php"
typedefstruct
{
size_tlen;
char*msg;
}MSG;
size_tget_data(char*ptr,size_tsize,size_tnmemb,MSG*msg)
{
msg->msg=realloc(msg->msg,msg->len+nmemb+1);
snprintf(msg->msg+msg->len,nmemb,"%s",ptr);
msg->len+=nmemb;
returnnmemb;
}
intmain(intargc,char**argv)
{
CURL*curl;
MSGmsg;
charbuf[1024];
chardata[2048];
curl=curl_easy_init();
msg.len=0;
msg.msg=NULL;
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,get_data);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&msg);
curl_easy_setopt(curl,CURLOPT_USERAGENT,"CBot/FromBai");
while(1)
{
printf(">");
scanf("%s",buf);
if(strcmp(buf,"exit")==0)
break;
snprintf(data,sizeof(data),"%s?msg=%s",BOT_SER,buf);
curl_easy_setopt(curl,CURLOPT_URL,data);
curl_easy_perform(curl);
if(msg.len)
{
printf("%s ",msg.msg);
msg.len=0;
free(msg.msg);
msg.msg=NULL;
}
}
curl_easy_cleanup(curl);
return0;
}