1

クライアントから送信された C プログラムをコンパイルし、クライアントでリンクして実行できるオブジェクト ファイルを返すコンパイル サーバーをプログラムしようとしています。これが私のクライアントプログラムとサーバープログラムです

client.py:

# Compilation client program

import sys, socket, string


File = raw_input("Enter the file name:") 
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssock.connect(('localhost', 5000))

csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
csock.connect(('localhost', 5001))

f = open(File, "rb")
data = f.read()
f.close()
ssock.send(File)                 #send filename
ssock.send(data)                 #send file
fd=raw_input("Enter a key to start recieving object file:") 

data=csock.recv(1024)            #receive status
if data=="sucess\n":
    File=File.replace(".c",".o") #objectfile name
    print "Object file, "+File+", recieved sucessfully"
else:
    print "There are compilation errors in " + File
    File="error.txt"             #errorfile name
    print "Errors are reported in the file error.txt"

fobj=open(File,"wb")
while 1:
    data=ssock.recv(1024)        # if any error in c sourcefile then  error gets                                         
                                 # eported in errorfile "error.txt" else objectfile is 
                                 # returned from server
    if not data:break
    fobj.write(data)
fobj.close()
ssock.close()
csock.close()

サーバー.py

#Compilation Server program

import subprocess
import socket, time, string, sys, urlparse, os
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssock.bind(('', 5000))                   
ssock.listen(2)
print 'Server Listening on port 5000'
csock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
csock.bind(('', 5001))
csock.listen(2)
print 'Control server listening on port 5001'
client, claddr = ssock.accept()
controlsoc, caddr = csock.accept()


filename=client.recv(1024)        #receive filename
print filename
###############  This code is not working, i'm not getting the reason   #######
###############    I want to receive a file more than 1KB from client   #######
f = open(filename,"wb")           #receive file======
while 1:
    data = client.recv(1024)
    if not data: break
    f.write(data)
f.close()
###############
###############


data="gcc -c " + filename + " 2> error.txt"  #shell command to execute c source file 
                                             #report errors if any to error.txt    
from subprocess import call

call(data,shell=True)                        #executes the above shell command
fil = filename.replace(".c",".o")
if (os.path.isfile(fil))== True:             #test for existence of objectfile 
    data = "sucess\n"                        #no objectfile => error in compilation
    filename = filename.replace(".c",".o")
else:
    data = "unsucessful\n"
    print data+"hi"
    filename = "error.txt"

controlsoc.send(data)
f = open(filename,"rb")
data=f.read()
f.close()
print data

client.send(data)

client.close()
controlsoc.close()

複数KBのファイルを受信できません。私のコードに欠陥はありますか、またはコンパイルサーバーをコーディングするという私の目的を達成するためにコードをどのように変更する必要がありますか? この点で私を助けてください..事前に感謝します

4

1 に答える 1

1

ここでの問題は、ファイル名を正確ssock.send(File)filename=client.recv(1024)読み取ることになり、それ以上ではないと仮定することですが、実際には、受信側はファイル名がどこで終わるかがわからず、ファイル名filename変数内のデータの一部を取得することになります。

TCP 接続は、バイトの双方向ストリームです。メッセージの境界についてはわかりません。1 つが反対側のsend複数に対応する場合があります(その逆も)。raw TCP の上にアプリケーション レベルのプロトコルrecvが必要です。

あなたのケースで最も簡単なのは、フォームのテキスト行をfile-size file-name\nヘッダーとして送信することです。このようにして、サーバーはヘッダーをファイル データから (改行を介して) 分離するだけでなく、予想されるファイル コンテンツのバイト数を認識し、複数のファイルに対して同じ TCP 接続を再利用できます。

于 2012-08-26T21:09:51.853 に答える