首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

套接字网络编程,该怎么解决

2013-01-23 
套接字网络编程哪位大侠能帮我解释下面几个问题一:为什么这两段程序都不终止呢?原因分别是什么1.#include

套接字网络编程
哪位大侠能帮我解释下面几个问题

一:为什么这两段程序都不终止呢?原因分别是什么
1.


#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv, char **envp) {
struct protoent *pe = getprotobyname("tcp");

int s = socket(AF_INET, SOCK_STREAM, pe -> p_proto);
struct sockaddr_in indirizzo;
indirizzo.sin_family = AF_INET;
indirizzo.sin_addr.s_addr = INADDR_ANY;
indirizzo.sin_port = htons(0);

 bind(s, (struct sockaddr *)&indirizzo, sizeof(indirizzo));

struct sockaddr_in ind_locale;
unsigned int len = sizeof(ind_locale);
int r = getsockname(s, (struct sockaddr *) &ind_locale, &len);


if (r < 0) {
perror("bind");
return -1;
}

printf("Porta allocata: %d\n", ind_locale.sin_port);

if (listen(s, 128) < 0) {
perror("listen");
return -1;
}

struct sockaddr_in chiamante;
len = sizeof(chiamante);
int data_socket = accept(s, (struct sockaddr *) &chiamante, &len);
if (data_socket < 0) {
perror("accept");
return -1;
}



return 0;
}


2

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv, char **envp) {
struct protoent *pe = getprotobyname("tcp");

int s = socket(AF_INET, SOCK_STREAM, pe -> p_proto);
struct sockaddr_in indirizzo;
indirizzo.sin_family = AF_INET;
indirizzo.sin_addr.s_addr = INADDR_ANY;
indirizzo.sin_port = htons(0);

 bind(s, (struct sockaddr *)&indirizzo, sizeof(indirizzo));

struct sockaddr_in ind_locale;
unsigned int len = sizeof(ind_locale);
int r = getsockname(s, (struct sockaddr *) &ind_locale, &len);


if (r < 0) {
perror("bind");
return -1;
}

printf("Porta allocata: %d\n", ind_locale.sin_port);

if (listen(s, 128) < 0) {
perror("listen");
return -1;
}

struct sockaddr_in chiamante;
len = sizeof(chiamante);
int data_socket = accept(s, (struct sockaddr *) &chiamante, &len);
if (data_socket < 0) {
perror("accept");
return -1;
}

int dim_buffer = 1024;
char buffer[dim_buffer];

r = recv(data_socket, buffer, dim_buffer, 0);
if (r < 0) {
perror("recv");
return -1;
}

buffer[r - 2] = '\0';

printf("Ricevuta stringa '%s', usando %d  byte\n", buffer, r);



return 0;
}




二:
为什么这段程序 运行时告诉我是段错误?原因在哪里?

#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>

int main(int argc, char **argv, char **envp) {

char *nome_host = "www.google.it";
char *nome_servizio = "http";
char *nome_protocollo = "tcp";

int dominio = AF_INET;
in_addr_t indirizzo = 0;
int porta = 0;

struct hostent *he = gethostbyname(nome_host);
indirizzo = *((in_addr_t *) he -> h_addr_list[0]);

struct servent* se = getservbyname(nome_servizio, nome_protocollo);
if (se == NULL) {
perror("getserverbyname");
return -1;
}
porta = se -> s_port;

struct sockaddr_in ind_trasporto;
ind_trasporto.sin_family = dominio;
ind_trasporto.sin_addr.s_addr = indirizzo;
ind_trasporto.sin_port = htons(porta);

struct protoent *pe = getprotobyname("tcp");
int s = socket(AF_INET, SOCK_STREAM, pe->p_proto);
if (connect(s,(struct sockaddr *) &ind_trasporto, sizeof(ind_trasporto)) < 0) {
perror("connect");
return -1;
}


return 0;
}

[解决办法]
accept, recv都是阻塞的说...
[解决办法]
段错误一般是指针非法,数组越界,访问了不该访问的内存。单步调试一下那里出现段错误,可以用windbg调试一下看看具体出现段错误在哪行代码。
[解决办法]
accept, recv都是阻塞,除非对方connect或send向你的程序发数据。看看《WinSock网络编程经络》吧,这有很多socket源码:
http://download.csdn.net/detail/geoff08zhang/4571358 

热点排行