套接字网络编程
哪位大侠能帮我解释下面几个问题
一:为什么这两段程序都不终止呢?原因分别是什么
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