用C语言在WIN32下编译一个简单的聊天程序,客户端向服务器发消息,服务器接到消息后会返回一个

小写的ok给客户端,并在客户端显示出来。以下是我的编程,缺少接收服务器发给客户端的ok,跪求补充完整。
//Client
#include<stdio.h>
#include<windows.h>
#include<winsock2.h>
int main() {
WSADATA ws;
SOCKET sockfd;
int ret;
struct sockaddr_in seraddr;
char buf[128];
ret = WSAStartup(MAKEWORD(2,2), &ws);
if (ret != 0) {
printf("Init Windows Socket Failed!\n");
return -1;
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == INVALID_SOCKET) {
printf("套接字创建失败!\n");
return -1;
}
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(9400);
seraddr.sin_addr.s_addr = inet_addr("192.168.1.187");
ret = connect(sockfd, (struct sockaddr*) &seraddr, sizeof(seraddr));
if (ret == -1) {
printf("套接字连接失败!\n");
closesocket(sockfd);
return 1;
}
while (1) {
memset(buf, 0, sizeof(buf));
scanf("%s", buf);
ret = send(sockfd, buf, strlen(buf), 0);
if (ret == -1) {
printf("套接字发送失败!\n");
closesocket(sockfd);
WSACleanup();
}
}
return 0;
}

第1个回答  2013-04-22
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<netinet/in.h>
#include<sys/socket.h>

#define SERVERPORT 5555#define BACKLOG 10
#define MAXLEN 1024

int main(){
int sockfd,client_fd;
int sin_size = 0;
int recvlen = 0;
char recvbuf[MAXLEN]={0};
struct sockaddr_in my_addr;
struct sockaddr_in cli_addr;
int iRet;

/*建立socke通信*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("Create socket error\n\n");
exit(1);
}

printf("socket success\n");

my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVERPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
memset(my_addr.sin_zero,0,8);

/*绑定socket端口*/
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
printf("bind error\n");
close(sockfd);
exit(1);
}

printf("bind success\n");

/*监听端口*/
if(listen(sockfd,BACKLOG) == -1){
printf("listen error\n!");
close(sockfd);
exit(1);
}

printf("listren success\n");

while(1) {

sin_size = sizeof(struct sockaddr_in);

/*阻塞等待客户端发送消息*/
if((client_fd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size)) == -1)
{
printf("accept error !");
continue;
}
printf("accept success\n");
printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr));

/*fork进程,子进程处理接收的信息*/
iRet=fork();
if(iRet < 0)
{
printf(" fork err, pid=[%d]", getpid());
}

/*fork返回0,为子进程*/
else if(iRet == 0)
{

printf("pid=[%d]", getpid());
printf("子进程\n");

memset(recvbuf,0,sizeof(recvbuf));

/*接收客户端发送的内容*/
if((recvlen = recv(client_fd,recvbuf,MAXLEN,0)) == -1)
{
printf("recv error\n");
close(client_fd);
exit(1);
}
printf("recvlen[%d]\n",recvlen);
printf("recvmsg:\n%s\n",recvbuf);

/*向客户端发送内容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)
{
printf("send error\n");
close(client_fd);
exit(1);
}
printf("sendmsg:\n%s\n",recvbuf);

close(client_fd);
exit(0);

}

/*父进程,返回子进程pid*/
else
{
printf("pid=[%d]", getpid());
printf("父进程\n");
continue;
}

}

close(sockfd);
exit(0);
}追问

大侠,我的意思是让你帮我把我的程序补充好。不是让你给我给新的。像你那种的网上多的是。。。

第2个回答  2013-04-22
好厉害的样子,完成了可以给我代码么!我也想看看!追问

没问题。

追答

时隔一年,我也写了很多关于socket的程序。。。。

第3个回答  2013-04-23
可以给我一份吗?谢谢,389129421@qq.com追问

还没有完成,先帮忙想。好了就给你。。。

追答

嗯,先在这儿谢谢啦!

如何用C语言编写一个简单的聊天室程序
客户端连接服务器(登陆,上传相应的数据(起码有聊天室编号))客户端发生消息给服务器(消息+聊天室编号)服务器根据客户端上传的聊天室编号广播消息 客户端接受服务器传来的消息 用到的技术就是socket编程(应该有其他的现成的框架,不过我用得比较多的是java,不清楚c的),如果还想做个界面的话,...

如何用C语言编写一个简单的聊天室程序
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);} ret...

linux下用c语言编写局域网聊天工具
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...

Linux下Socket网络编程聊天室 程序运行后出错,服务器端显示 accept:inva...
回答:参数不正确

求linux socket网络编程代码
网络通信原理在文件传输程序设计中的应用网络上的绝大多数通信采用的都是客户机\/服务器机制(Client\/Server),即服务器提供服务,客户是这些服务的使用者,服务器首先创建一个Socket,然后将该Socket与本地地址\/端口号绑定(Bind()),成功之后就在相应的Socket上监听(Listen()) 。当Accept()函数捕捉到一个连接服务(Connect...

一个Linux多进程编程?
通过C语言编写一个程序,程序中需要有两个进程,假设这两个进程是A和B,通过这两个进程模拟一个类似QQ聊天的情景,A进程和B进程分别代表通话一方,A进程能够发消息给B进程,同时还能接收B进程发送过来的消息,同样的,B进程能发送消息给A,同时接收A进程发送来的消息。实验要求:编程的程序能在ubuntu下面运行,提供实验报告...

要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层...
买个域名,租个空间,做个自己的网站。进阶加深1、 C语言和操作系统调用重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》、《算法导论》和《编程珠玑》。学习(麻省理工免费课程)计算机科学和编程导论学习(麻省理工免费课程)C语言内存管理学习Unix\/Linux系统调用(...

...打开两个终端窗口互相发送和接收消息(类似qq聊天) ??
linux有命令来实现这个功能: talk 这个不仅能在本机的终端、虚拟终端间聊天,还可以通过互联网,与其它主机的终端登录用户聊天。如果用于某个程序的一部分,可以使用 popen 的方式调用talk,比自己写方便得多。在同一计算机下,可以使用echo "fdasf">>\/dev\/pts\/? 或 echo "fdasf">>\/dev\/tty?的...

端游,手游服务端常用的架构是什么样的
类型1:卡牌、跑酷等弱交互服务端卡牌跑酷类因为交互弱,玩家和玩家之间不需要实时面对面PK,打一下对方的离线数据,计算下排行榜,买卖下道具即可,所以实现往往使用简单的 HTTP服务器:登录时可以使用非对称加密(RSA, DH),服务器根据客户端uid,当前时间戳还有服务端私钥,计算哈希得到的加密 key 并发送给客户端。之后双方...

cmd中全部命令```
最大登录用户数(即可使用服务器共享资源的最大用户数) 每个会话打开文件的最大数(即用户可在一个会话中打开服务器文件的最大数) 空闲会话时间(最小值) chkdsk.exe 磁盘检查. Chkdsk \/r 2000命令控制台中的Chkdsk \/r命令检查修复系统文件 cleanmgr 垃圾整理 Clipbrd 剪贴板查看器 C:boot.ini 打开启动菜单 ...

相似回答