我们老师让写一个简单的聊天软件,并且实现不同机子之间的通信,我用的是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. 进程加载与segment

    elf文件是一组结构体和数据的组合. elf文件是一种文件格式,这种格式定义了进程加载器如何读取elf文件的内容. elf文件的程序头或者segment对如何加载(读取)做了说明.

  2. 【51nod1677】treecnt(树上数学题)

    点此看题面 大致题意: 给你一个节点从1~n编号的树,让你从中选择k个节点并通过选择的边联通,且要使选择的边数最少,让你计算对于所有选择k个节点的情况最小选择边数的总和. 题解 这道题乍一看很麻烦:最 ...

  3. SpringMVC+Hibernate框架快速搭建

    1.  新建Maven项目springmvc 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  4. AngularJs学习笔记-数据绑定、管道

    数据绑定.管道 (1)数据绑定(Angular中默认是单向绑定) 1.[]方括号 可以用于子组件传值 由于是单向绑定,所以当子组件中的iStars属性发生改变时,不会影响到父组件中product.ra ...

  5. 搭建mock服务器(微信小程序)

    搭建mock服务器(微信小程序) 如何在微信小程序使用mock.js实在是个问题,为了完全模拟访问路由和数据,选择在搭建本地mock服务器是一个不错的选择. 以下示例了一个mock服务器的搭建过程以及 ...

  6. FTP、SFTP与FTPS

    先简单介绍下FTP的基础知识 FTP的传输有两种方式:ASCII.二进制. FTP支持两种模式:Standard (PORT方式,主动方式),Passive (PASV,被动方式). 主动模式 FTP ...

  7. MySQL - 表中某个状态字段的状态表示区分最好用数字,如status - [9999:失败,1111:成功]

    表中某个状态字段的状态表示区分最好用数字,如status - [9999:失败,1111:成功]

  8. 2D和3D效果

    <style type="text/css"> #div1{ width: 200px; height: 200px; background-color:#aaa; c ...

  9. 日期增加天数--JS Date

    //日期加天数的方法 //dataStr日期字符串 //dayCount 要增加的天数 //return 增加n天后的日期字符串 function dateAddDays(dataStr,dayCou ...

  10. LeetCode949-给定数字能组成的最大时间

    问题: 给定一个由 4 位数字组成的数组,返回可以设置的符合 24 小时制的最大时间. 最小的 24 小时制时间是 00:00,而最大的是 23:59.从 00:00 (午夜)开始算起,过得越久,时间 ...