论坛: 编程破解 标题: 看看这个socket通信的程序是怎么回事? 复制本贴地址    
作者: turbo_c [turbo_c]    论坛用户   登录
服务器端 :

――――――――――――――――――――――――――――――
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment(lib,"ws2_32.lib")
main()
{
SOCKET s,sn;
sockaddr_in itslf;
// sockaddr addrt;


unsigned long addr=inet_addr("127.0.0.1");
WSADATA wsadata;
WSAStartup(0x0202,&wsadata);
// from.sin_addr.s_addr=addr;//INADDR_BROADCAST;
// from.sin_family=AF_INET;
// from.sin_port=htons(5050);

// strcpy(addrt.sa_data,"127.0.0.1");
// addrt.sa_family=AF_INET;

itslf.sin_addr.s_addr=addr;//htonl(INADDR_ANY);
itslf.sin_family=AF_INET;
itslf.sin_port=htons(5050);
int itslflen=sizeof(itslf);
bool opt;
opt=TRUE;
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s == INVALID_SOCKET)
printf("socket error");
//    setsockopt(s,SOL_SOCKET,SOCK_STREAM,(char far *)&opt,sizeof(opt));
if(bind(s,(struct sockaddr *)&itslf,sizeof(itslf)) == SOCKET_ERROR)
printf("bind error");
char buf[256];
listen(s,5);
while(1)
{
ZeroMemory(buf,256);
printf("等待....");
if(sn=accept(s,( sockaddr  *)&itslf,&itslflen)==INVALID_SOCKET)printf("accept 出错");
if(recv(sn,buf,256,0) == -1)printf("  recv error\n");  //有问题
if(send(sn,buf,246,0) ==-1)printf(" send error\n");
printf("%s",buf);
Sleep(2000);
printf("%s\n",buf);
}
}


[此贴被 286(unique) 在 05月18日09时26分 编辑过]

地主 发表时间: 05-05-17 21:57

回复: turbo_c [turbo_c]   论坛用户   登录
客户端:
――――――――――――――――――――――――――――――――――――――――
#include<stdlib.h>
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock.h>
#include<windows.h>
#pragma comment(lib,"ws2_32.lib")
main()
{
// TODO: Add extra validation here

SOCKET s;
sockaddr_in addrto;
WSADATA wsadata;
char *senmsg="can you receive ?";
char a[256];

WSAStartup(0x0202,&wsadata);
// s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
addrto.sin_family=AF_INET;
unsigned long addr=inet_addr("127.0.0.1");

addrto.sin_addr.s_addr= addr;//htonl(INADDR_ANY);
addrto.sin_port=htons(5050);
bool opt=true;
int alen=sizeof(addrto);
s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(connect(s,(struct sockaddr FAR *)&addrto,alen) == SOCKET_ERROR){
printf("connect失败");
}

if(send(s,senmsg,sizeof(senmsg),0) == -1)cout<<WSAGetLastError()<<endl;
printf("s :%s\n",senmsg);
    recv(s,a,256,0);
printf("a :%s\n",a);
    printf("s :%s",senmsg);
}

B1层 发表时间: 05-05-17 21:58

回复: turbo_c [turbo_c]   论坛用户   登录
连个能连上,但就是recv函数有问题接收不到,

请大哥帮我看看!

B2层 发表时间: 05-05-17 21:59

回复: wxngzybb [wxngzybb]   论坛用户   登录
大哥哥
你的itslf.sin_addr.s_addr=addr是不是还有一层才付值
是不是该itslf.sin_addr.S_un.S_addr=addr大哥哥

B3层 发表时间: 05-05-17 23:19

回复: turbo_c [turbo_c]   论坛用户   登录
struct sockaddr_in {
        short  sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};


struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;

好像是这样的吧,,不少吧

B4层 发表时间: 05-05-17 23:36

回复: 286 [unique]   版主   登录
server端:

while(1)
{
ZeroMemory(buf,256);
printf("等待....");
if((sn=accept(s,( sockaddr  *)&itslf,&itslflen))  ==INVALID_SOCKET)  <---------此处写法
printf("accept 出错");
else    <------变成二选一。
{
if(recv(sn,buf,256,0) == SOCKET_ERROR)printf("  recv error\n");  //有问题
if(send(sn,buf,246,0) ==SOCKET_ERROR)printf(" send error\n");
printf("%s",buf);
}
Sleep(2000);
//printf("%s\n",buf);
}

B5层 发表时间: 05-05-18 09:24

回复: 286 [unique]   版主   登录
每个程序最后都应加上shutdown 和close(sock),养成谁申请,谁关闭的习惯。

B6层 发表时间: 05-05-18 09:26

回复: wxngzybb [wxngzybb]   论坛用户   登录
286大哥哥
我提个bug哈
你的程序会耗尽socket的
要养成关闭socket苗数字的好习惯

B7层 发表时间: 05-05-20 14:41

回复: 286 [unique]   版主   登录

请兄弟指明“苗数字”是什么呀?呵呵,我还真没看出来是哪的问题导致耗尽。

B8层 发表时间: 05-05-20 15:08

回复: wxngzybb [wxngzybb]   论坛用户   登录
while(1)
{
ZeroMemory(buf,256);
printf("等待....");
if((sn=accept(s,( sockaddr  *)&itslf,&itslflen))  ==INVALID_SOCKET)  <---------此处写法
printf("accept 出错");
else    <------变成二选一。
{
if(recv(sn,buf,256,0) == SOCKET_ERROR)printf("  recv error\n");  //有问题
if(send(sn,buf,246,0) ==SOCKET_ERROR)printf(" send error\n");
printf("%s",buf);
}
Sleep(2000);

你觉得不会阿

B9层 发表时间: 05-05-20 23:06

回复: 286 [unique]   版主   登录
应该不会吧?

B10层 发表时间: 05-05-23 09:15

回复: wxngzybb [wxngzybb]   论坛用户   登录
server端:

while(1)
{
ZeroMemory(buf,256);
printf("等待....");
if((sn=accept(s,( sockaddr  *)&itslf,&itslflen))  ==INVALID_SOCKET)  <---------此处写法
printf("accept 出错");
else    <------变成二选一。
{
if(recv(sn,buf,256,0) == SOCKET_ERROR)printf("  recv error\n");  //有问题
if(send(sn,buf,246,0) ==SOCKET_ERROR)printf(" send error\n");
printf("%s",buf);
}
Sleep(2000);
//printf("%s\n",buf);

(在这里必须要关闭套接口描述字sn)


}
不过这种单一进程的结构感觉不到这个重要性,多进程的结构,连接一多就会崩溃

B11层 发表时间: 05-05-23 19:39

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号