Linux系OSを使って,C言語でネットワークプログラミングに取り組んでいます.
以下のプログラムをsolaris上で
%gcc -lnsl -lsocket -lresolv -o echo_server echo_server.c
と,コンパイルしたのですが,
未定義の 最初に参照している
シンボル ファイル
Readline /var/tmp//ccyx9O2s.o
ld: 重大なエラー: シンボル参照エラー。echo_server に書き込まれる出力はありません。
collect2: ld はステータス 1 で終了しました
と出てしまい,うまく通りません.
何か他のオプションをつけてコンパイルしなければならないのでしょうか.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <unistd.h>
#include <arpa/nameser.h>
#include <resolv.h>
#include <netinet/in.h>
#define ERR -1
#define PORT 50000
#define BUFSIZE 1024
void usage(void);
char *command_name;
int socket(int domain, int type, int protocol);
int ReadLine(int sd, char *buf);
int WriteLine(int sd, char *buf);
int main(int argc, char* argv[]){
int sds; //ソケットディスクリプタ
int sda; //
struct sockaddr_in server; //サーバプロセスのソケットアドレス情報
struct sockaddr_in client; //サーバプロセスのソケットアドレス情報
int fromlen;
int ret;
struct hostent *hp; //ホスト情報
char buf[BUFSIZE];
int temp = 1;
int i;
if ((command_name = rindex(argv[0], '/')) !=NULL)
command_name++;
else
command_name = argv[0];
if(argc != 2)
usage();
/* ソケットの作成 */
if ( (sds = socket(PF_INET, SOCK_STREAM, 0)) == ERR) {
perror("server: socket");
exit(1);
}
/* ソケットオプションの設定 */
if (setsockopt(sds, SOL_SOCKET, SO_REUSEADDR, (void *)&temp, sizeof(temp))){
perror("server:setsockopt");
exit(1);
}
/* サーバプロセスのソケットアドレス情報の設定 */
memset((void*)&server, 0, sizeof(server));
server.sin_family = PF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(INADDR_ANY);
/* ソケットにアドレスをバインド */
if(bind(sds, (struct sockaddr *)&server, sizeof(server)) == ERR) {
perror("server: bind");
exit(1);
}
/* 接続要求の受け入れ準備 */
/* バインドされたソケットを待機状態に */
if(listen(sds, 5) == ERR) {
perror("server: listen");
exit(1);
}
memset((void *)&client, 0, sizeof(client));
fromlen = sizeof(client);
/* クライアントからの接続要求を受け入れ,通信回路を確保する */
/* クライアントと接続したソケットの識別子がsdaに格納される */
if ( (sda = accept(sds, (struct sockaddr *)&client, &fromlen))
== ERR ){
perror("server: accept");
exit(1);
}
close(sds);/* sds は必要なくなったので閉じる*/
/* クライアントと接続されているソケットからのデータ受信*/
do {
memset(buf, '\0', BUFSIZE);
ret = Readline(sda, buf);
for ( i=0; i<ret; i++){
if (isalpha(buf[i]))
buf[i] = toupper(buf[i]);
}
WriteLine(sda, buf);
} while(1);
close(sda);
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage: %s\n", command_name);
exit(1);
}
int ReadLine(int sd, char *buf)
{
int i = 0;
unsigned char ch;
while (read(sd, &ch, 1) == 1){
buf[i++] = ch;
if ( i > BUFSIZE-1 ) return -1;
if (ch == '\n' ){
buf[i] = '\0';
return i;
}
}
buf[i] = '\0';
return -1;
}
int WriteLine(int sd, char *buf)
{
int a;
a = write(sd, buf, strlen(buf));
return a;
}