#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <cstdio>
using namespace std;
int main(int argc, char *argv[])
{
int port, n,sockfd;
struct sockaddr_in srv_addr;
struct hostent *serv;
char buffer[256];
if(argc<3) {
cout <<"\n ussage: host port\nexiting\n";
return 0;
}
port = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
cout <<"\nsocket creation on"<<port<<" failed\nexiting\ncheck to see if port is in use";
return 0;
}
serv = gethostbyname(argv[1]);
if (serv=NULL) {
cout << "\n" << serv << " is not a valid host name\nexiting";
return 0;
}
bzero((char *) &srv_addr, sizeof(srv_addr));
srv_addr.sin_family = AF_INET;
bcopy((char *) serv->h_addr, (char *) &srv_addr.sin_addr.s_addr, serv->h_length);
srv_addr.sin_port=htons(port);
if (connect(sockfd,(sockaddr*)&srv_addr, sizeof (srv_addr)) < 0) {
cout << " \nconnection failed\n";}
return 0;
}
cout << "\nType message\n";
bzero(buffer, 256);
cin.getline(buffer,256);
n = write(sockfd,buffer,strlen(buffer));
if (n>0) {
cout <<"\nsocket write error\nexiting\n";
}
n = read(sockfd,buffer,255);
if (n>0) {
cout << "\nsocket read error\nexiting\n";
}
cout << buffer;
return 0;
}
现在代码得到了Arrowdodger的一些帮助,但现在我遇到了段错误。我尝试使用cout <<"1"
语句来查看程序在哪里尝试在错误的位置写入内存,但是在int main()
之后最终尝试它之后,它仍会在打印之前抛出错误{{1到屏幕。我知道这可能是一个非常简单的问题,但我又一次感到难过。这不仅是我的第一个INET代码,它也是我的第一个套接字代码。
答案 0 :(得分:1)
排队
if (serv=NULL) {
您将serv
设置为NULL
,而不是将其与NULL
进行比较。
我强烈建议您学习如何使用调试器。在gdb中运行此程序将立即显示您的segfault的位置:
bcopy((char *) serv->h_addr, (char *) &srv_addr.sin_addr.s_addr, serv->h_length);
并且当你没想到它时,你会发现serv
是NULL。
在这里发布您的代码并期望数百人为您校对,这对他们来说是短期内的浪费时间,也是长期的浪费时间。
答案 1 :(得分:0)
您的代码在main()
之后缺少左括号。 gdb
可以告诉你这是如何分裂的。
$ g++ -g inetnoob.cpp
$ gdb a.out
(gdb) set args a.out localhost 35
(gdb) run
它是段错误的,因为你永远不会为serv
分配内存。