我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是SOCKET编程。不废话多说了,先附上代码:

服务器端server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h> #define BUFLEN 1024
#define PORT 6666
#define LISTNUM 20 int main()
{
int sockfd, newfd;
struct sockaddr_in s_addr, c_addr;
char buf[BUFLEN];
socklen_t len;
unsigned int port, listnum;
fd_set rfds;
struct timeval tv;
int retval,maxfd; /*建立socket*/
if((sockfd = socket(PF_INET, SOCK_STREAM, )) == -){
perror("socket");
exit(errno);
}else
printf("socket create success!\n");
memset(&s_addr,,sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
s_addr.sin_addr.s_addr = htons(INADDR_ANY); /*把地址和端口帮定到套接字上*/
if((bind(sockfd, (struct sockaddr*) &s_addr,sizeof(struct sockaddr))) == -){
perror("bind");
exit(errno);
}else
printf("bind success!\n");
/*侦听本地端口*/
if(listen(sockfd,listnum) == -){
perror("listen");
exit(errno);
}else
printf("the server is listening!\n");
while(){
printf("*****************聊天开始***************\n");
len = sizeof(struct sockaddr);
if((newfd = accept(sockfd,(struct sockaddr*) &c_addr, &len)) == -){
perror("accept");
exit(errno);
}else
printf("正在与您聊天的客户端是:%s: %d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));
while(){
FD_ZERO(&rfds);
FD_SET(, &rfds);
maxfd = ;
FD_SET(newfd, &rfds);
/*找出文件描述符集合中最大的文件描述符*/
if(maxfd < newfd)
maxfd = newfd;
/*设置超时时间*/
tv.tv_sec = ;
tv.tv_usec = ;
/*等待聊天*/
retval = select(maxfd+, &rfds, NULL, NULL, &tv);
if(retval == -){
printf("select出错,与该客户端连接的程序将退出\n");
break;
}else if(retval == ){
printf("waiting...\n");
continue;
}else{
/*用户输入信息了*/
if(FD_ISSET(, &rfds)){ /******发送消息*******/
memset(buf,,sizeof(buf));
/*fgets函数:从流中读取BUFLEN-1个字符*/
fgets(buf,BUFLEN,stdin);
/*打印发送的消息*/
//fputs(buf,stdout);
if(!strncasecmp(buf,"quit",)){
printf("server 请求终止聊天!\n");
break;
}
len = send(newfd,buf,strlen(buf),);
if(len > )
printf("\t消息发送成功:%s\n",buf);
else{
printf("消息发送失败!\n");
break;
}
}
/*客户端发来了消息*/
if(FD_ISSET(newfd, &rfds)){
/******接收消息*******/
memset(buf,,sizeof(buf));
/*fgets函数:从流中读取BUFLEN-1个字符*/
len = recv(newfd,buf,BUFLEN,);
if(len > )
printf("客户端发来的信息是:%s\n",buf);
else{
if(len < )
printf("接受消息失败!\n");
else
printf("客户端退出了,聊天终止!\n");
break;
}
}
}
}
/*关闭聊天的套接字*/
close(newfd);
/*是否退出服务器*/
printf("服务器是否退出程序:y->是;n->否? ");
bzero(buf, BUFLEN);
fgets(buf,BUFLEN, stdin);
if(!strncasecmp(buf,"y",)){
printf("server 退出!\n");
break;
}
}
/*关闭服务器的套接字*/
close(sockfd);
return ;
}

客户端client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h> #define BUFLEN 1024
#define PORT 6666 int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in s_addr;
socklen_t len;
unsigned int port;
char buf[BUFLEN];
fd_set rfds;
struct timeval tv;
int retval, maxfd; /*建立socket*/
if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -){
perror("socket");
exit(errno);
}else
printf("socket create success!\n"); /*设置服务器ip*/
memset(&s_addr,,sizeof(s_addr));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
if (inet_aton(argv[], (struct in_addr *)&s_addr.sin_addr.s_addr) == ) {
perror(argv[]);
exit(errno);
}
/*开始连接服务器*/
if(connect(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr)) == -){
perror("connect");
exit(errno);
}else
printf("conncet success!\n"); while(){
FD_ZERO(&rfds);
FD_SET(, &rfds);
maxfd = ;
FD_SET(sockfd, &rfds);
if(maxfd < sockfd)
maxfd = sockfd;
tv.tv_sec = ;
tv.tv_usec = ;
retval = select(maxfd+, &rfds, NULL, NULL, &tv);
if(retval == -){
printf("select出错,客户端程序退出\n");
break;
}else if(retval == ){
printf("waiting...\n");
continue;
}else{
/*服务器发来了消息*/
if(FD_ISSET(sockfd,&rfds)){
/******接收消息*******/
bzero(buf,BUFLEN);
len = recv(sockfd,buf,BUFLEN,);
if(len > )
printf("服务器发来的消息是:%s\n",buf);
else{
if(len < )
printf("接受消息失败!\n");
else
printf("服务器退出了,聊天终止!\n");
break;
}
}
/*用户输入信息了,开始处理信息并发送*/
if(FD_ISSET(, &rfds)){
/******发送消息*******/
bzero(buf,BUFLEN);
fgets(buf,BUFLEN,stdin); if(!strncasecmp(buf,"quit",)){
printf("client 请求终止聊天!\n");
break;
}
len = send(sockfd,buf,strlen(buf),);
if(len > )
printf("\t消息发送成功:%s\n",buf);
else{
printf("消息发送失败!\n");
break;
}
}
} }
/*关闭连接*/
close(sockfd); return ;
}

在程序的服务端输入

lwp@lwp-linux:~/Desktop/1234$ ./server

在程序的客户端输入

lwp@lwp-linux:~/Desktop/1234$ ./client 192.168.100.80

当然这都是我在我的机子上截的图,客户端我们可以放到任何一台机子上,只要保证都能在同一个局域网下,连到我的IP地址就行。开启服务端后,在开启客户端,我们就可以聊天了:

server端:
waiting...
waiting...
waiting...
nihal
消息发送成功:nihal 客户端发来的信息是:zhuzhu
hehe
消息发送成功:hehe 客户端发来的信息是:haha
客户端退出了,聊天终止!
服务器是否退出程序:y->是;n->否? y
server端退出。

client端:

waiting...
waiting...
waiting...
服务器发来的消息是:nihal
zhuzhu
消息发送成功:zhuzhu
服务器发来的消息是:hehe
haha
消息发送成功:haha

socket实例C语言:一个简单的聊天程序的更多相关文章

  1. C语言一个简单的闹钟程序

    #include <stdio.h> #include <stdbool.h> #include <Windows.h> ; i < ; ++i) { // ...

  2. Udp实现简单的聊天程序

    在<UDP通讯协议>这篇文章中,简单的说明了Udp协议特征及如何Udp协议传输数据 这里将用Udp协议技术,编写一个简单的聊天程序: //发送端: package com.shindo.j ...

  3. 使用Ajax long polling实现简单的聊天程序

    关于web实时通信,通常使用长轮询或这长连接方式进行实现. 为了能够实际体会长轮询,通过Ajax长轮询实现了一个简单的聊天程序,在此作为笔记. 长轮询 传统的轮询方式是,客户端定时(一般使用setIn ...

  4. 用Go语言实现一个简单的聊天机器人

    一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...

  5. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  6. Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程

    SO_REUSEADDR选项 在上一篇文章的最后我们贴出了一个简单的C/S通信的例程.在该例程序中,使用"Ctrl+c"结束通信后,服务器是无法立即重启的,如果尝试重启服务器,将被 ...

  7. 简单的聊天程序,主要用到的是Socket

    服务端: import java.io.*; import java.net.*; import java.util.*; public class ChatServer { boolean stat ...

  8. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  9. [SignalR]一个简单的聊天室

    原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...

随机推荐

  1. RAC基本使用

    @interface ViewController () @property (weak, nonatomic) IBOutlet lwRedView *redView; @property (wea ...

  2. python_55_局部和全局变量

    school='Hebut'#school为全局变量 sex='male'#全局变量 names=['Wang Yu','Bai Jingyi','Zhang Yu'] hobby='姑娘' def ...

  3. Restful API 的设计规范

    RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计.降低开发的复杂性,提高系统的可伸缩性. Restful API接口规范包括以下部分: 一.协议 API与用户的通信协议, ...

  4. C# 多态与new关键字

    1. 你通常怎样用多态? 假设我有一个类,里面有一个 PrintStatus 方法,用于打印实例的当前状态,我希望该类的派生类都带有一个 PrintStatus 方法,并且这些方法都用于打印其实例的当 ...

  5. 当GetWindowText获取不到标题时可以用SendMessage

    GetWindowText所有父窗口标题基本可以获取到, 但是当获取父窗口下的子窗口控件标题文本时有时候就没那么好用了, 这个时候可以通过SendMessage发送消息来获取,也很简单,C/C++代码 ...

  6. asp.net 中 UpdataPanel 的使用注意点

    1. 在UpdataPanel 前必须加上asp:ScriptManager的控件,保证页面能够正常显示

  7. 1- vue django restful framework 打造生鲜超市

    Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...

  8. 进入docker容器并执行命令的的3中方法

    进入docker容器并执行命令的的3中方法 docker exec   nsenter   docker attach "container" 建议使用nsenter, exec有 ...

  9. shell的条件判断

    .字符串判断 str1 = str2 当两个串有相同内容.长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串 ...

  10. ATM-interface-bank

    from lib import commonfrom db import db_handler user_logger = common.get_logger('bank') def check_ba ...