고수님들....이거 좀 봐주세요...소켓프로그램인데요....ㅠ.ㅠ
글쓴이: k9252 / 작성시간: 목, 2003/05/15 - 9:58오후
============= client.c=======================
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 255
int main(int argc, char **argv)
{
int s, len_out;
struct sockaddr_in server_addr;
char *haddr;
char buf[BUF_LEN];
FILE *fp;
char line;
if (argc != 2) {
printf("usage : %s ip_address\n", argv[0]);
exit(0);
}
haddr = argv[1];
if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
printf("Can't create socket\n");
exit(0);
}
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(haddr);
server_addr.sin_port = htons(2049);
if (connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
printf("Can't connect.\n");
exit(0);
}
if ((fp = fopen("test.txt","r")) == NULL) {
printf("File open error : ");
exit(0);
}
printf("File open success\n");
if (fgets(buf, BUF_LEN, fp)) {
buf[BUF_LEN] = '\0';
len_out = strlen(buf);
} else {
printf("fgets error\n");
exit(0);
}
if (write(s, buf, len_out) < 0) {
printf("write error\n");
exit(0);
}
fclose(fp);
close(s);
}
================server.c=======================
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_LEN 128
int main(int argc, char *argv[]) {
struct sockaddr_in server_addr, client_addr;
int server_fd, client_fd;
int len;
char buf[BUF_LEN + 1];
FILE *fp;
fp = fopen("receive.txt", "w");
if (fp == NULL) {
perror("File write error : ");
exit(0);
}
if (argc != 2) {
printf("usage : %s port\n", argv[0]);
exit(0);
}
if ((server_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
printf("Server : Can't open stream socket.");
exit(0);
}
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(atoi(argv[1]));
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
printf("Server : Can't bind local address.\n");
exit(0);
}
listen(server_fd, 5);
while(1) {
printf("Server : waiting connection request.\n");
len = sizeof(client_addr);
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);
if (client_fd < 0) {
printf("Server : accept failed.\n");
exit(0);
}
printf("Server : A client connected.\n");
fp = read(client_fd, buf, sizeof(buf));
write(client_fd, buf, fp);
close(client_fd);
}
close(server_fd);
}
제가 할려고 하는 것은요....
client에서 파일을 읽어서 버퍼에 저장해서
server에 파일을 생성해서 client의 버퍼에 저장되어 있는 내용을 그대로 옮기는 것입니다.
근데 제가 이상하게 짠것인지 잘 안되네요...
에러는 없는데...실행이 안되어서요...소켓프로그램인뎅...
모가 잘 못 되었는지 좀 봐주세요..고수님들.....
아직 C를 시작한지 얼마되지 않아서 잘 몰라요..
Forums:


server.c에서여시스템 콜 read의 return value는 버
server.c에서여
시스템 콜 read의 return value는 버퍼에서 읽은 만큼의 크기 입니다.
시스템콜 open, read, write의 다시 한번 공부하심이...
Re: 고수님들....이거 좀 봐주세요...소켓프로그램인데요....ㅠ.
서버에서 파일을 열때 FILE 포인터를 이용할려고 했으면...
파일에 쓸때는 fwrite 를 이용해야죠...
그리고 read 함수는 읽은 바이트수를 리턴하는데...
그걸 fp 에다가 저장하면 fp가 엉뚱한대를 가리키게 됩니다...
망설이지 말고 해보는거야~
서버 수정.
cli.c
:1. buf[BUF_LEN] = '\0'; 는 의미없음 . fgets는 읽은 버퍼 마지막에 null을 삽입하므로.
srv.c
1. read의 리턴값(읽은 바이트 수)는 write의 세번째 아큐먼트여야함.
2. 마지막 write 함수의 아큐먼트는 아래처럼 바껴야함.
client_fd -> fileno(fp)
fp -> read의
[/code][/b]
\\(^^ )^^)// **
댓글 달기