地图销售网站,jquery 打开新网站,忘记网站备案账号,手机浏览器 网站开发目录 服务器端 
代码 
客户端 
代码解析 
服务器端 
原理 
遇到的阻碍以及解决办法 
客户端 
原理 
遇到的阻碍以及解决办法 
运行结果截图 
总结 服务器端 
代码 
#include sys/types.h
#include sys/socket.h
#include stdio.h
#include netinet…目录 服务器端 
代码 
客户端 
代码解析 
服务器端 
原理 
遇到的阻碍以及解决办法 
客户端 
原理 
遇到的阻碍以及解决办法 
运行结果截图 
总结 服务器端 
代码 
#include sys/types.h
#include sys/socket.h
#include stdio.h
#include netinet/in.h
#include arpa/inet.h
#include unistd.h
#include string.h
#include stdlib.h
#include fcntl.h
#include sys/shm.h
#include iostream
#include thread
#include list
using namespace std;
#define PORT 8806
#define IP 127.0.0.1
int msocket;
struct sockaddr_in servaddr;
socklen_t m_len;
listint connList;
void addPerson(){while(1){int f_socketaccept(msocket,(struct sockaddr *) servaddr,m_len);connList.push_back(f_socket);cout玩家f_socket:进入房间endl;}
}
void sendList(int f_socket){for(int i0;iconnList.size()-1;i){char buf_1[1024];memset(buf_1,0,sizeof(buf_1));sprintf(buf_1,玩家%d(在线)\n,i3);send(f_socket,buf_1,sizeof(buf_1),0);}
}
void recv_meg(){struct timeval tv;tv.tv_sec0;tv.tv_usec0;listint::iterator it;while(true){for(itconnList.begin();it!connList.end();it){fd_set rds;FD_ZERO(rds);int max_fd0;int reval0;FD_SET(*it,rds);if(*itmax_fd){max_fd*it;}revalselect(max_fd1,rds,NULL,NULL,tv);if(reval-1){couterrorendl;}else if(reval0){//pass}else{char buf[1024];memset(buf,0,sizeof(buf));int len_1recv(*it,buf,sizeof(buf),0);if(len_10){if(buf[0]#){sendList(*it);}cout收到*it玩家的消息:;coutbufendl;}}}}}
int main(){msocketsocket(AF_INET,SOCK_STREAM,0);memset(servaddr,0,sizeof(servaddr));servaddr.sin_familyAF_INET;servaddr.sin_addr.s_addrhtonl(INADDR_ANY);servaddr.sin_porthtons(PORT);if(bind(msocket,(struct sockaddr*) servaddr,sizeof(servaddr))-1){perror(bind);exit(1);}if(listen(msocket,20)-1){perror(listen);exit(1);}m_lensizeof(servaddr);thread thr_1(recv_meg);thr_1.detach();thread th_2(addPerson);th_2.detach();while(1){}return 0;
} 
客户端 
#include iostream
#include sys/socket.h
#include stdio.h
#include sys/time.h
#include netinet/in.h
#include arpa/inet.h
#include cstring
using namespace std;
#define PORT 8806
int main(){int socket_1;fd_set rds;FD_ZERO(rds);struct timeval tv;socket_1socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in servaddr;servaddr.sin_familyAF_INET;servaddr.sin_porthtons(PORT);servaddr.sin_addr.s_addrinet_addr(127.0.0.1);if(connect(socket_1,(struct sockaddr*)servaddr,sizeof(servaddr))0){perror(connect);exit(1);}while(1){tv.tv_sec10;tv.tv_usec0;FD_ZERO(rds);FD_SET(0,rds);FD_SET(socket_1,rds);int max_fd0;int reval0;if(max_fdsocket_1){max_fdsocket_1;}revalselect(max_fd1,rds,NULL,NULL,tv);if(reval-1){couterror!endl;}else if(reval0){//pass}else{if(FD_ISSET(socket_1,rds)){char buf_2 [1024];int len_1recv(socket_1,buf_2,sizeof(buf_2,0),0);if(len_10){cout.write(buf_2,len_1);}memset(buf_2,0,sizeof(buf_2));}if(FD_ISSET(0,rds)){char buf_3 [1024];fgets(buf_3,sizeof(buf_3),stdin);send(socket_1,buf_3,sizeof(buf_3),0);memset(buf_3,0,sizeof(buf_3));}}}return 0;
} 
代码解析 
服务器端 
原理 
创建了一个套接字绑定端口和ip地址 
之后创建一个线程用于接收外面的连接请求并且把生成的客户端的套接字存储到connList的链表中 
之后用在又创建以线程用select函数来判断是否有客户端进行发送请求如果有判断第一个首字母是否为#如果是那么就放回发送connList链表 
遇到的阻碍以及解决办法 
发送的数据的时候最好加一个\n因为客户端没有换行所以打印的时候就会怪怪的由于是第一次实战开始那个大小端互相转化把我搞懵了索性本来也就不难干脆就记下来就行了。创建的服务器套接字以及客户端生成的套接字容易搞混用命名把它分开来了。超时时间目前服务器端来看没什么用反而会影响新客户端的连接服务器端会遍历套接字列表如果在等待的时候有新的连接进行请求依旧会继续堵塞因为他一次只能select一个套接字 
客户端 
原理 
客户端就只有一个主函数同样绑定套接字之后用select用来判断是否有输入或者接受请求如果有输入则发送输入字节流如果有接收请求则调用接收函数并且将其打印出来 
遇到的阻碍以及解决办法 
打印输出的列表用printf函数或者用cout.write(字符串,长度)不要用cout函数会乱码——printf函数根据格式化字符串来输出数据而cout在默认情况下将字符串视为null-terminated字符串即以’\0’结尾。所以如果buf_2中的数据不是以’\0’结尾的cout将会继续输出直到遇到’\0’为止可能造成输出乱码。这里可以设置超时时间因为它只是监听套接字和输入流没有上面服务器端一样的遍历。 
运行结果截图 总结 
一个基于 
C入门教程18socket 实现简单聊天室_std socket_爱我呦呦的博客-CSDN博客文章浏览阅读8.6k次点赞8次收藏88次。本节通过socket实现一个简单的聊天室功能聊天室中如果有人说话则服务器负责将内容传送给聊天室的其他人那么就需要客户端和服务端两个程序客户端负责发送消息服务端负责接收和转发消息客户端代码#include #include #include #include #include #in_std sockethttps://blog.csdn.net/u011416077/article/details/123593428的拓展功能。并且把一些不足之处给指出来了。