各大哥,帮我看看我的代码,我想有不少地方是错的,但看后先不要吐血就行,帮我改一下^__^
#include<winsock2.h>
#include<iostream.h>
void main(int argc , char *argv[])
{
WSADATA wsadata;
SOCKET sock;
SOCKADDR_IN serveraddr;
int port = 5150;
int ret;
char buf[1024],ch;
int i=0;
if (argc <1))//是用于调试的,这样可以不用参数就可以运行,正式时会把他改为2 {
cout<<"这是一个客户端,请输入服务端地址.\nclient.exe <IP address> <port>\n";
return;
}
if((ret= WSAStartup(MAKEWORD(2,2), &wsadata))!= 0)
{
cout<<"WINSOCK 初始化失败."<<endl;
return;
}
if((sock=socket(AF_INET,SOCK_STREAM,6))==INVALID_SOCKET)
{
cout<<"SOCKET 建立失败在: "<<WSAGetLastError();
WSACleanup();
return;
}
serveraddr.sin_family = AF_INET;
//serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_port = htons(port);
//serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cout<<"尝试连接 "<<inet_ntoa(serveraddr.sin_addr)<<":"<<port<<" 中\n";
if(connect(sock,(SOCKADDR *)&serveraddr,sizeof(serveraddr))== SOCKET_ERROR)
{
cout<<"连接失败在: "<<WSAGetLastError()<<endl;
closesocket(sock);
WSACleanup();
return;
}
cout<<"可以进行通信了."<<endl;
while(1)
{
cout<<"发到"<<inet_ntoa(serveraddr.sin_addr)<<": ";
//用&&'\n'才是本意,但用了后不能发送到服务端
while(cin.get(ch)&&'\n'))//这个不会改啊,只是想把输入的东西,只要回家,就可以发送,要怎么写啊
{
buf[i]=ch;
i++;
}
//这里有问题,改为send(sock, buf, i, 0)就不行了,还有什么每发一个字他就输出一次成功?
if((ret = send(sock, "buf",1024, 0))== SOCKET_ERROR)
{
cout<<"...\n发送失败,"<<WSAGetLastError() ;
}
//cout<<"发送成功\n";
i=0;
}
cout<<"断开连接\n";
closesocket(sock);
WSACleanup();
}
//是不是每一个CONNECT只能发一次信息?为什么第一次之后的服务端就收不到了
#include<winsock2.h>
#include<iostream.h>
void main(int argc , char *argv[])
{
WSADATA wsadata;
SOCKET sock;
SOCKADDR_IN serveraddr;
int port = 5150;
int ret;
char buf[1024],ch;
int i=0;
if (argc <1))//是用于调试的,这样可以不用参数就可以运行,正式时会把他改为2 {
cout<<"这是一个客户端,请输入服务端地址.\nclient.exe <IP address> <port>\n";
return;
}
if((ret= WSAStartup(MAKEWORD(2,2), &wsadata))!= 0)
{
cout<<"WINSOCK 初始化失败."<<endl;
return;
}
if((sock=socket(AF_INET,SOCK_STREAM,6))==INVALID_SOCKET)
{
cout<<"SOCKET 建立失败在: "<<WSAGetLastError();
WSACleanup();
return;
}
serveraddr.sin_family = AF_INET;
//serveraddr.sin_port = htons(atoi(argv[2]));
serveraddr.sin_port = htons(port);
//serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
cout<<"尝试连接 "<<inet_ntoa(serveraddr.sin_addr)<<":"<<port<<" 中\n";
if(connect(sock,(SOCKADDR *)&serveraddr,sizeof(serveraddr))== SOCKET_ERROR)
{
cout<<"连接失败在: "<<WSAGetLastError()<<endl;
closesocket(sock);
WSACleanup();
return;
}
cout<<"可以进行通信了."<<endl;
while(1)
{
cout<<"发到"<<inet_ntoa(serveraddr.sin_addr)<<": ";
//用&&'\n'才是本意,但用了后不能发送到服务端
while(cin.get(ch)&&'\n'))//这个不会改啊,只是想把输入的东西,只要回家,就可以发送,要怎么写啊
{
buf[i]=ch;
i++;
}
//这里有问题,改为send(sock, buf, i, 0)就不行了,还有什么每发一个字他就输出一次成功?
if((ret = send(sock, "buf",1024, 0))== SOCKET_ERROR)
{
cout<<"...\n发送失败,"<<WSAGetLastError() ;
}
//cout<<"发送成功\n";
i=0;
}
cout<<"断开连接\n";
closesocket(sock);
WSACleanup();
}
//是不是每一个CONNECT只能发一次信息?为什么第一次之后的服务端就收不到了
解决方案 »
- GetDlgItemText的问题
- 弱弱的问一下,将数字信号转为视频信号,应该用什么语言编写?
- 如何获取本机的外网地址
- VC5.0环境,把以前的工程封装成dll,出现warning C4251
- (在线等)如何保证程序出错后仍能继续运行?为什么try……catch不起作用
- 为啥进度条的指示条在循环stepIt()完毕后,自动消失了?我要让它处于占满状态
- 如何实现像windows资源管理器那样的树形列表框
- 急急:小波的图象边缘检测算法
- 好文转贴:我和比尔. 盖茨--不同的成长之路
- VC6读取出来MySQL出来全是????
- 有没有什么API函数可以设置本地机的IP地址?
- 问一个困扰多天的问题(网卡连接类型的改变),求助。。
下面是用C写的,实现了多个客户连接服务器,服务器负责把每个客户端的数据转发给所有客户。转成C++应该很简单吧
//client
#include "winsock2.h"
#include "stdio.h"
SOCKET init(char *ip,short port);
void showmessage(LPVOID lpv);
//process_cli(SOCKET clientfd);void main()
{
char buf[100];
char talk[100];
char ipselect[7];
HANDLE handles[100];
unsigned long myID;
int numServed=0;
//FILE *stream;
SOCKET listenfd;
memset(buf,100,0);
//printf("请输入服务器地址:");
//gets(ipselect);
listenfd=init("127.0.0.1",8001);
// process_cli(listenfd);
// closesocket(listenfd);
while(strcmp(talk,"bye")!=0)
{
handles[numServed]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)showmessage,
(LPVOID)listenfd,0,&myID);
//printf("请输入聊天信息>");
gets(talk);
//scanf("%s",talk);
send(listenfd,talk,sizeof(talk),0);
numServed++;
}
}
void showmessage(LPVOID lpv)
{
SOCKET listenfd=(SOCKET)lpv;
char buf[100]="1";
while(buf)
{
if(recv(listenfd,buf,100,0) == SOCKET_ERROR)
{
printf("接收数据发生错误,%d\n",WSAGetLastError());
return;
}
printf("%s\n",buf);
}
}
SOCKET init(char *ip,short port)
{
SOCKET listenfd;
sockaddr_in server;
WSADATA ws;
WSAStartup(MAKEWORD(2,1),&ws);
listenfd=socket(PF_INET,SOCK_STREAM,0);
server.sin_addr.S_un.S_addr=inet_addr(ip);
server.sin_family=PF_INET;
server.sin_port=htons(port);
if(connect(listenfd,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
{
printf("无法连接服务器!\n");
return 0;
} if(listenfd==INVALID_SOCKET)
{
printf("无法创建服务器socket,%d\n",WSAGetLastError());
return 0;
}
return listenfd;
}
//server
#include "winsock2.h"
#include "stdio.h"
int numServed=0;
SOCKET clisocket[100];
SOCKET init(u_short port);
struct ARG
{
SOCKET fd;
sockaddr_in ip;
char clientname[100];
};
void process_client(LPVOID lpv);
void process_send(LPVOID lpv);
void main()
{
ARG arg;
int size;
SOCKET listenfd,acceptfd;
int numServed2=0;
struct sockaddr_in client;
HANDLE handle1[100],handle2[100];
unsigned long myid1,myid2;
size=sizeof(client);
listenfd=init(8001);
listen(listenfd,1);
printf("Listen in 8001.\n");
while(numServed<100)
{
acceptfd=accept(listenfd,(sockaddr *)&client,&size);
arg.fd=acceptfd;
arg.ip=client;
clisocket[numServed]=acceptfd;
//process_client(acceptfd,client);
handle1[numServed]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_client,(LPVOID)&arg,0,&myid1);
if(handle1[numServed]=NULL)
printf("Failure!");
handle2[numServed2]=CreateThread(NULL,1000,(LPTHREAD_START_ROUTINE)process_send,(LPVOID)&arg,0,&myid2);
if(handle2[numServed2]=NULL)
printf("Failure!");
numServed++;
numServed2++;
}
}
SOCKET init(u_short port)
{
SOCKET listenfd;
struct sockaddr_in server;
WSADATA WSAdata;
WSAStartup(MAKEWORD(2,1),&WSAdata);
listenfd=socket(AF_INET,SOCK_STREAM,0);
server.sin_family=PF_INET;
server.sin_addr.S_un.S_addr=INADDR_ANY;
server.sin_port=htons(port);
bind(listenfd,(struct sockaddr *)&server,sizeof(server));
listen(listenfd,5);
printf("server running! listen on %d\n",port);
return listenfd;
}
void process_client(LPVOID lpv)
{
char buf[100];
int i;
sockaddr_in client;
struct ARG *arg;
arg=(ARG *)lpv;
SOCKET acceptfd=arg->fd;
client=arg->ip;
memset(buf,100,0);
if(acceptfd==INVALID_SOCKET)
printf("Error:accept failed\n");
while(1)
{
if(recv(acceptfd,buf,sizeof(buf),0)==-1)
{
printf("the client has leave!\n");
break;
}
printf("%s says:",inet_ntoa(client.sin_addr));
printf("%s\n",buf);
if(strcmp(buf,"bye")!=0)
{
for(i=0;i<numServed;i++)
{
printf("Send to %i\n",i);
send(clisocket[i],strcat(strcat(inet_ntoa(client.sin_addr),":"),buf),100,0);
}
}
else
{
break;
}
}
//send(acceptfd,buf,sizeof(buf),0);}
void process_send(LPVOID lpv)
{
char sendbuf1[100];
char b[100]="服务器对所有用户说:";
int a;
struct ARG* accept_sd=(struct ARG*)lpv;
while(1)
{
memset(sendbuf1,0,sizeof(sendbuf1));
gets(sendbuf1);
for(a=0;a<numServed;a++)
{
send(clisocket[a],b,100,0);
send(clisocket[a],sendbuf1,100,0);
}
}
}